我有一个控件,在回发时将表单结果保存回数据库。它通过迭代查询字符串来填充要保存的值。因此,对于以下SQL语句(为了讨论而大大简化)...
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
如果循环查询字符串键,则会按以下方式进行:
For Each Key As String In Request.QueryString.Keys
Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key))
Next
然而,我现在遇到了一个情况,在某些情况下,这些变量可能不在查询字符串中出现。如果我没有在查询字符串中传递val2,我会收到一个错误:System.Data.SqlClient.SqlException: 必须声明标量变量 "@val2"
。
尝试在SQL语句中检测缺失的值...
IF @val2 IS NOT NULL
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
...已经失败。
如何最好地解决这个问题?我必须使用正则表达式解析SQL块,扫描查询字符串中不存在的变量名吗?或者,有没有更优雅的方法来解决这个问题?
更新:在VB代码中检测空值会破坏将代码与其上下文解耦的目的。我不想为每个可能被传递或未被传递的变量添加条件,以此来污染我的函数。
Command.Parameters.AddWithValue("@val2", (object)MyValue ?? (object)DBNull.Value)
。 - Nick StrupatCommand.Parameters.AddWithValue("@val2", If(MyValue, DBNull.Value))
。(可能需要将 MyValue 强制转换为 Object,但尚未测试。) - Heinzi