【问题标题】:How to use parameters "@" in an SQL command in VB如何在VB的SQL命令中使用参数“@”
【发布时间】:2017-05-08 17:10:15
【问题描述】:

我有这段代码可以在 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()

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

【问题讨论】:

标签: sql vb.net parameters


【解决方案1】:

你在避免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 就可以使用了。

【讨论】:

  • 不喜欢 AddWithValue() 方法。有时它会错误地猜测参数类型(即:日期、varchar 与 nvarchar),有时当发生这种情况时,查询不再与应有的索引对齐,从而有时会导致严重的性能问题。
  • @JoelCoehoorn 我也不是,但这是让事情顺利进行的最快方式。
  • 谢谢,这对我的目的更有意义。
【解决方案2】:

这里有很多改进:

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

【讨论】:

  • 这些改进有哪些?
  • @PsychoData 在抛出异常的情况下正确关闭连接,使用查询参数,executenonquery()代替executereader,显式参数类型代替推断
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多