我有一个控件,可以在回发时将表单结果保存回数据库。它通过遍历查询字符串来填充要保存的值。所以,对于下面的 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: Must declare the scalar value "@val2"
.
尝试检测 SQL 语句中的缺失值...
IF @val2 IS NOT NULL
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
... 失败了。
攻击这个的最好方法是什么?我必须用 RegEx 解析 SQL 块,扫描查询字符串中不存在的变量名吗?或者,有没有更优雅的方法?
更新:在 VB 代码隐藏中检测空值违背了将代码与其上下文分离的目的。我宁愿不要在我的函数中乱扔可能通过或未通过的每个可能的变量的条件。