如何在VB中的SQL命令中使用参数“@”

时间:2012-06-21 13:56:38

标签: sql vb.net parameters

我有这个代码用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()

你是怎么做到的?如果在运行代码时文本框中有“标记”,则会崩溃。

2 个答案:

答案 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