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

Tit*_*mer 9 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()
Run Code Online (Sandbox Code Playgroud)

这是我从网上看到的参数设置参数的蹩脚尝试,我对此并不了解.

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()
Run Code Online (Sandbox Code Playgroud)

你怎么做到这一点?如果在运行代码时文本框中有"标记",则会崩溃.

das*_*ght 23

您正走在避开Bobby Tables的正确道路上,但您对@参数的理解是不完整的.

命名参数的行为类似于编程语言中的变量:首先,在SQL命令中使用它们,然后在VB.NET或C#程序中提供它们的值,如下所示:

MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn)
MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text)
Run Code Online (Sandbox Code Playgroud)

请注意命令的文本是如何自包含的:它不再取决于文本框中文本的值,因此用户不能通过插入自己的命令来破坏SQL.@TicBoxText成为变量的名称,代表命令文本中的值; AddWithValue提供价值的电话.在那之后,你ExecuteReader准备好了.

  • 不是AddWithValue()方法的粉丝.有时它会错误地猜测参数类型(即:date,varchar vs nvarchar),有时当发生这种情况时,查询不再与它应该的索引对齐,从而导致有时出现严重的性能问题. (2认同)

Joe*_*orn 10

这里有许多改进:

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
Run Code Online (Sandbox Code Playgroud)

  • @PsychoData在抛出异常的情况下正确关闭连接,使用查询参数,executiontenonquery()而不是executereader,显式参数类型而不是推断 (2认同)