【问题标题】:Opinion: SqlCommand style: bind int vs. put it in the string意见:SqlCommand 风格:bind int vs. put it in the string
【发布时间】:2015-02-07 16:59:16
【问题描述】:

假设我有,例如:

Dim _id As Integer = 7

我将使用它从以 foo_id 为主键的表中选择一行。我可以将 Integer 值与 AddWithValue 绑定,例如:

Dim cmd As New SqlCommand("select * from foo where foo_id = @id", sqlconn)
cmd.Parameters.AddWithValue("@id", _id)

或者我可以将语句构造为纯字符串:

Dim cmd As New SqlCommand("select * from foo where foo_id = " & _id, sqlconn)

显然我总是,总是绑定一个字符串,但使用 Integer 键我可以说服自己使用任何一种方法。

任何人都有意见,为什么?

【问题讨论】:

  • 首先为什么是因为使用参数避免了sql注入。
  • 用字符串注入,是的。整数...实际上不可能,除非代码可能被损坏以将 Integer 对象转换为字符串,此时您可能会争辩说整个 SqlCommand 可能已损坏。

标签: sql sql-server vb.net coding-style


【解决方案1】:

这里没有辩论或意见的空间。第二种方法,连接字符串以创建 sql 命令,是最糟糕的选择。在您的实际情况下,没有不好的后果,因为您有一个整数,并且您似乎对它的定义和初始化方式有严格的控制,但无论如何,这是一个坏习惯,当您不考虑时可能会反击关于其令人讨厌的后果。

我不想在这里重复已经说过数千遍的内容。
第二种方法的主要问题是:

第一种方法也不是没有问题。 AddWithValue 应该非常小心地使用,因为它决定将什么参数传递给底层数据库,查看值的数据类型,有时(特别是日期和带有小数的数值,它的决定并不总是正确的)和具有不同的字符串参数长度破坏数据库引擎维护的查询缓存的工作。同样,请阅读这些链接中的文章以获取对问题的更详细描述。

所以,最好的方法是

cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int)).Value = _id

【讨论】:

    【解决方案2】:

    当您以正确的数据类型绑定变量时,SQL 服务器可以缓存该变量的计划,并在下次调用时节省时间/cpu。如果您在其中使用带有值的字符串,您很可能最终会因大量类似的 SQL 语句而使您的计划缓存膨胀,这些 SQL 语句不能用于其他语句,因为 SQL 文本不同。

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 2023-01-29
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2022-12-27
      • 2022-12-02
      • 2022-12-19
      相关资源
      最近更新 更多