我有这个代码用VB中的文本框中的数据更新我的SQL数据库。我需要使用参数,以防文本中包含一个标记,'或引号“等。这就是我所拥有的:
dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP")
dbConn.Open()
MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _
"'WHERE Number = 1", dbConn)
MyDataReader = MyCommand.ExecuteReader()
MyDataReader.Close()
dbConn.Close()
这是我从网上看到的参数设置参数的蹩脚尝试,我不太了解这一点。
dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP")
dbConn.Open()
MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text & _
"'WHERE Number = 1", dbConn)
MyDataReader = MyCommand.ExecuteReader()
MyDataReader.Close()
dbConn.Close()
你是怎么做到的?如果在运行代码时文本框中有“标记”,则会崩溃。
答案 0 :(得分:21)
您正走在避开Bobby Tables的正确道路上,但您对@
参数的理解不完整。
命名参数在编程语言中的行为类似于变量:首先,在SQL命令中使用它们,然后在VB.NET或C#程序中提供它们的值,如下所示:
MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn)
MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text)
注意命令的文本是如何自包含的:它不再取决于文本框中文本的值,因此用户不能通过插入自己的命令来破坏SQL。 @TicBoxText
成为变量的名称,代表命令文本中的值;对AddWithValue
的调用提供了值。之后,您的ExecuteReader
已准备就绪。
答案 1 :(得分:9)
这里有许多改进:
Using dbConn As New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP"), _
MyCommand As SqlCommand("UPDATE SeansMessage SET Message = @Message WHERE Number = 1", dbConn)
'Make sure to use your exact DbType (ie: VarChar vs NVarChar) and size
MyCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = TicBoxText.Text
dbConn.Open()
MyCommand.ExecuteNonQuery() ' don't open a data reader: just use ExecuteNonQuery
End Using 'Using block will close the connection for you