sql
  • vb.net
  • exception
  • sqlexception
  • 2010-05-07 163 views 0 likes 
    0

    我正在尝试一些SQL代码,但当我尝试此代码时出现错误。VB.NET SqlException是未处理

    Main.database.ExecuteCommand("UPDATE Contacts SET first_name='" + c.first_name + _ 
               "', middle='" + c.middle + _ 
               "', last_name='" + c.last_name + _ 
               "', age='" + c.age + _ 
               "', mobile_phone='" + c.mobile_phone + _ 
               "', home_phone='" + c.home_phone + _ 
               "', work_phone='" + c.work_phone + _ 
               "', home_street='" + c.home_street + _ 
               "', home_city='" + c.home_city + _ 
               "', home_state='" + c.home_state + _ 
               "', home_zip='" + c.home_zip + _ 
               "', work_street='" + c.work_street + _ 
               "', work_city='" + c.work_city + _ 
               "', work_state='" + c.work_state + _ 
               "', work_zip='" + c.work_zip + _ 
               "', home_www='" + c.home_www + _ 
               "', work_www='" + c.work_www + _ 
               "', home_email='" + c.home_email + _ 
               "', work_email='" + c.work_email + _ 
               "' WHERE first_name='" + c.first_name + _ 
               "' AND last_name='" + c.last_name + "'") 
    

    我收到以下错误

    SQL异常了未处理

    的数据类型text和varchar是在等于运算符不兼容。


    我使用参数

      Using conn As New SqlConnection(), _ 
          myCommand As New SqlCommand("UPDATE Contacts SET" + _ 
                 "[email protected]_name" + _ 
                 "AND [email protected]" + _ 
                 "AND [email protected]_name" + _ 
                 "AND [email protected]" + _ 
                 "AND [email protected]_phone" + _ 
                 "AND [email protected]_phone" + _ 
                 "AND [email protected]_phone" + _ 
                 "AND [email protected]_street" + _ 
                 "AND [email protected]_city" + _ 
                 "AND [email protected]_state" + _ 
                 "AND [email protected]_zip" + _ 
                 "AND [email protected]_street" + _ 
                 "AND [email protected]_city" + _ 
                 "AND [email protected]_state" + _ 
                 "AND [email protected]_zip" + _ 
                 "AND [email protected]_www" + _ 
                 "AND [email protected]_www" + _ 
                 "AND [email protected]_email" + _ 
                 "AND [email protected]_email" + _ 
                 "WHERE [email protected]_name" + _ 
                 "AND [email protected]_name", conn) 
    
          myCommand.Parameters.Add(New SqlParameter("@first_name", c.first_name)) 
          myCommand.Parameters.Add(New SqlParameter("@middle", c.middle)) 
          myCommand.Parameters.Add(New SqlParameter("@last_name", c.last_name)) 
          myCommand.Parameters.Add(New SqlParameter("@age", c.age)) 
          myCommand.Parameters.Add(New SqlParameter("@mobile_phone", c.mobile_phone)) 
          myCommand.Parameters.Add(New SqlParameter("@home_phone", c.home_phone)) 
          myCommand.Parameters.Add(New SqlParameter("@work_phone", c.work_phone)) 
          myCommand.Parameters.Add(New SqlParameter("@home_street", c.home_street)) 
          myCommand.Parameters.Add(New SqlParameter("@home_city", c.home_city)) 
          myCommand.Parameters.Add(New SqlParameter("@home_state", c.home_state)) 
          myCommand.Parameters.Add(New SqlParameter("@home_zip", c.home_zip)) 
          myCommand.Parameters.Add(New SqlParameter("@work_street", c.work_street)) 
          myCommand.Parameters.Add(New SqlParameter("@work_city", c.work_city)) 
          myCommand.Parameters.Add(New SqlParameter("@work_state", c.work_state)) 
          myCommand.Parameters.Add(New SqlParameter("@work_zip", c.work_zip)) 
          myCommand.Parameters.Add(New SqlParameter("@home_www", c.home_www)) 
          myCommand.Parameters.Add(New SqlParameter("@work_www", c.work_www)) 
          myCommand.Parameters.Add(New SqlParameter("@home_email", c.home_email)) 
          myCommand.Parameters.Add(New SqlParameter("@work_email", c.work_email)) 
    
          conn.Open() 
    
          myCommand.ExecuteNonQuery() 
    
          conn.Close() 
    
         End Using 
    

    试过的代码进行修改,但我仍然有初始化这个错误

    ConnectionString属性尚未初始化的连接有问题。

    +5

    有人可以说“Sql注入”?或''; DROP TABLE联系人; - '? – 2010-05-07 20:37:47

    +1

    @Joel,只要这个网站被部署,我就可以。 – 2010-05-07 20:39:25

    +0

    这可能是您的“年龄”列错误,但正如其他人所说,这应该被重写为参数化查询。 – RedFilter 2010-05-07 20:39:48

    回答

    4

    Eeek!

    摆脱那个动态的SQL!这完全不安全。改用参数化查询!这里有一个小例子:

    Using conn As New SqlConnection(), _ 
         cmd As New SqlCommand("UPDATE Contacts SET first_name = @firstName", conn) 
        conn.Open() 
        cmd.Parameters.Add(new SqlParameter("firstName", c.first_name)) 
        cmd.ExecuteNonQuery() 
    End Using 
    
    +0

    http://msdn.microsoft.com/en-us/library/yy6y35y8%28v=VS.100%29.aspx – 2010-05-07 20:42:15

    2

    正如我在我的评论中暗示的那样,那个代码是完全不可接受的。严重的是,停止你现在正在做的事情,忘记这个异常,直到你明白什么是sql注入,为什么你的代码易受攻击,以及如何正确使用查询参数来保护它。

    我是说。

    后你这样做,并重新编码该使用参数化查询,回去修改表中的SQL服务器,这样你的名字,姓氏,和大多数其他文本字段使用nvarchar数据类型而不是。

    sql server中的text数据类型意味着外部文本,因为该行本身只存储指向实际文本的指针。文本本身保存在一个完全不同的地方。这样做是为了解决sql server中行的8192字节大小限制,这意味着你不能修改或比较文本类型的字段。您只能检索或替换这些字段中的数据。 “文本”类型仅用于大型(> 1K)文本字段。

    +0

    感谢上帝其他人说它... – 2010-05-07 20:43:47

    +0

    但是,你永远不知道电话号码可以多久一天 :) – RedFilter 2010-05-07 20:48:51

    0

    以上所有,参数是manditory,我发现这是一个美妙的如何对我的招数http://www.sqlservercentral.com/articles/.Net/workingwithsqlparameterinnet/2311/


    一个是转储字符串,并尝试在一个查询窗口。 SQL Server接口将直接指向有问题的代码。

    相关问题