请考虑以下代码:
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)
假设我动态构建了一个复杂的sql语句,可能包含或不包含@Param2
参数 - 将它作为参数添加到命令有什么危害吗?
我的真实用例显然比这复杂得多,但总的来说,这是我应该避免的模式;如果是这样,为什么?
答案 0 :(得分:1)
我要注意的唯一一点是,如果你调用.AddWithValue
,你可以将它留给SQL Server来弄清楚参数的数据类型是什么。
SQL Server在猜测方面做得非常出色 - 但有时候,它会“次优”,并且提供详细信息会对你有所帮助。
所以我个人倾向于总是使用这段代码:
SqlParameter aParam = new SqlParameter("@Param1", SqlDbType.VarChar, 50);
aParam.Value = param1Value;
这有两个主要好处:
您可以轻松地将其包装在例如static helper类,甚至将它用作扩展方法。
这是一项更多的工作,但是您可以获得更多控制权,并且可以避免不必要的,耗时的数据类型转换和其他意外的副作用,如果您将其留给SQL Server来猜测您的类型。
答案 1 :(得分:0)
避免传递不需要的参数始终是最佳做法。如果你传入一个没有值的参数,那么它要么假设你正在寻找一个NULL,空字符串,要么它会给你一个无法处理请求的错误。