意见:SqlCommand 风格:绑定 int 与将其放入字符串中

Opinion: SqlCommand style: bind int vs. put it in the string

假设我有,例如:

Dim _id As Integer = 7

我将用它来 select 来自 table 的一行,其中 foo_id 是主键。要么我可以将整数值与 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)

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

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

这里没有辩论或意见的余地。第二种方法,连接字符串以创建 sql 命令,是最糟糕的选择。在您的实际情况下,没有不良后果,因为您有一个整数并且您似乎严格控制它的定义和初始化方式,但无论如何,这是一个坏习惯,当您不认为时可能会让您退缩关于它的恶劣后果。

我无意在这里重复已经说过千遍的话。
第二种方法的主要问题是:

  • Sql Injection,
  • Parsing problems,
  • Difficult to correctly write and understand the Sql Command Text

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

所以,最好的方法是

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

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