2015-03-03 74 views
0

我想在我的“服务费用”表中获取一个id指定行的值。当我尝试执行以下代码时,会出现一个异常,该异常在System.Data.dll中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理。附加信息:'a34附近的语法错误'。“与asp.net中的DataSet相关的Sql异常

它是关于数据集对象吗?

PS:id是; ee83089d-4 A34 -46e0-be6c-b8b506f31a8e

if (Request.QueryString["MyId"] != null) 
      { 
       isUpdate = true; 
       var id = Request.QueryString["MyId"].ToString(); 

       SqlCommand cmd2 = new SqlCommand("SELECT * FROM ServiceFees WHERE Id=" + id, connection); 
       SqlDataAdapter adapter2 = new SqlDataAdapter(cmd2); 

       DataSet ds = new DataSet(); 
       adapter2.Fill(ds); 

       sf1.name = ds.Tables[0].Rows[0][1].ToString(); 

      } 
+1

that al低sql注入,应该参数化。 – user1666620 2015-03-03 10:10:06

+0

需要包括引号 – 2015-03-03 10:14:28

回答

2

附上您在单引号ID,它应该看起来像:

SqlCommand cmd2 = new SqlCommand("SELECT * FROM ServiceFees WHERE Id='" + id +"'", connection); 

标识是GUID,它应该单引号括起来。

+0

谢谢你的解决方案,它的工作。 – 2015-03-03 10:13:14

+1

这个工程,但允许SQL注入 – 2015-03-03 10:15:21

+0

是更好地使用参数化查询 – 2015-03-03 10:15:48

0

您正在将id未加引号传递给SQL。

因此,它可能试图计算ee83089d-4a34-46e0-be6c-b8b506f31a8e的结果。

你可能想:

SqlCommand cmd2 = new SqlCommand("SELECT * FROM ServiceFees WHERE Id='" + 
    id + "'", connection); 

或者一些其它的SQL调用,它不会受到注入攻击。

1
SqlCommand cmd2 = new SqlCommand("SELECT * FROM ServiceFees WHERE Id= @id", connection); 
cmd2.Parameters.Add(new SqlParameter("id",id)); 

避免sql注入。

1

谨防SQL注入的

不要通过在单引号参数,双引号

始终使用SqlParameter

当你的参数是字符串你需要把它作为string数据类型

string Id="ee83089d-4a34-46e0-be6c-b8b506f31a8e"; 
    SqlParameter para1=new SqlParameter("@Id",SqlDbType.Varchar,500); 
    para1.Value=Id; 
    SqlCommand cmd2 = new SqlCommand("SELECT * FROM ServiceFees WHERE [email protected]" , connection); 
cmd2.Parameters.Add(para1); 

SqlDataAdapter adapter2 = new SqlDataAdapter(cmd2); 
+0

你也必须添加参数的命令也 – 2015-03-03 10:17:29

+0

@FlorianSchmidinger哦谢谢忘了包括它 – 2015-03-03 10:19:59