未使用的 sql 参数 - 它们有什么危害吗?

Dan*_*anP 6 sql-server ado.net

考虑以下代码:

Dim sql = "SELECT * FROM MyTable WHERE value1 = @Param1"

If someCondition Then
   sql = sql + " AND value2 = @Param2"
End If

Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@Param1", param1Value)
cmd.Parameters.AddWithValue("@Param2", param2Value)
Run Code Online (Sandbox Code Playgroud)

假设我动态构建了一个复杂的 sql 语句,该语句可能包含也可能不包含@Param2参数 - 将其作为参数添加到命令中是否有任何危害?

我的实际用例显然比这复杂得多,但总的来说,这是我应该避免的模式吗?如果是这样,为什么?

mar*_*c_s 1

我要注意的唯一一点是,如果您调用.AddWithValue,则由 SQL Server 来确定参数的数据类型。

SQL Server 在猜测方面做得非常好 - 但有时,它的猜测“次优”,并且提供详细信息会对您有所帮助。

所以我个人倾向于总是使用这段代码:

SqlParameter aParam = new SqlParameter("@Param1", SqlDbType.VarChar, 50);
aParam.Value = param1Value;
Run Code Online (Sandbox Code Playgroud)

这样做有两个主要好处:

  • 您可以定义显式类型,这很重要,例如在使用 VARCHAR 与 NVARCHAR 时(否则您可能会产生大量不必要的类型转换)
  • 您可以定义例如字符串参数的最大长度

您可以轻松地将其包装在静态帮助器类中,甚至将其用作扩展方法。

这需要更多的工作,但您可以获得更多的控制权,并且如果您让 SQL Server 来猜测您的类型,则可能会避免不必要的、耗时的数据类型转换和其他意外的副作用。