12

我有这段代码可以从 VB 中的文本框中的数据更新我的 SQL 数据库。我需要使用参数,以防文本包含一个tic标记,',或一个引号,“等。这是我所拥有的:

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()

你怎么做到这一点?因为如果在我运行代码时文本框中有一个 ' 标记,它就会崩溃。

4

2 回答 2

29

您在避免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就可以开始了。

于 2012-06-21T14:03:57.463 回答
12

这里有很多改进:

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
于 2012-06-21T14:07:55.417 回答