我正在尝试一些SQL代码但是在尝试此代码时出现错误。
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 Exception未处理
数据类型text和varchar在等于运算符中不兼容。
我尝试使用参数
进行代码修订 Using conn As New SqlConnection(), _
myCommand As New SqlCommand("UPDATE Contacts SET" + _
"first_name=@first_name" + _
"AND middle=@middle" + _
"AND last_name=@last_name" + _
"AND age=@age" + _
"AND mobile_phone=@mobile_phone" + _
"AND home_phone=@home_phone" + _
"AND work_phone=@work_phone" + _
"AND home_street=@home_street" + _
"AND home_city=@home_city" + _
"AND home_state=@home_state" + _
"AND home_zip=@home_zip" + _
"AND work_street=@work_street" + _
"AND work_city=@work_city" + _
"AND work_state=@work_state" + _
"AND work_zip=@work_zip" + _
"AND home_www=@home_www" + _
"AND work_www=@work_www" + _
"AND home_email=@home_email" + _
"AND work_email=@work_email" + _
"WHERE first_name=@first_name" + _
"AND last_name=@last_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属性尚未初始化。
答案 0 :(得分: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
答案 1 :(得分:2)
正如我在评论中提到的那样,该代码是完全不可接受的。说真的,停止你正在做的任何事情并忘记这个异常,直到你理解sql注入是什么,为什么你的代码容易受到攻击,以及如何正确使用查询参数来保护它。
我的意思是。
在之后你已经完成并重新编码它以使用参数化查询,返回并修改sql server中的表,以便你的first_name,last_name和大多数其他文本字段使用nvarchar而是数据类型。
sql server中的text
数据类型表示外部文本,因为该行本身仅存储指向实际文本的指针。文本本身保存在完全不同的地方。这样做是为了绕过sql server中行的8192字节大小限制,这意味着你不能修改或比较text类型的字段。您只能检索或替换这些字段中的数据。 “text”类型仅适用于大型(> 1K)文本字段。
答案 2 :(得分:0)
以上所有,参数化都是强制性的,我发现这是一个很棒的操作方法http://www.sqlservercentral.com/articles/.Net/workingwithsqlparameterinnet/2311/
我的一个技巧是转储字符串并在查询窗口中尝试。 SQL Server接口将直接指向有问题的代码。