我有一个控件,可以在回发时将表单结果保存回数据库。它通过遍历查询字符串来填充要保存的值。因此,对于下面的 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 block ,扫描查询字符串中不存在的变量名吗?或者,有没有更优雅的方法?
更新:在 VB 代码隐藏中检测空值违背了将代码与其上下文分离的目的。我宁愿不要在我的函数中乱扔可能通过或未通过的每个可能的变量的条件。
最佳答案
首先,我建议不要将查询字符串中的所有条目都添加为参数名称,我不确定这是否不安全,但我不会冒险。
问题是你在打电话
Command.Parameters.AddWithValue("@val2", null)
你应该调用的是:
If MyValue Is Nothing Then
Command.Parameters.AddWithValue("@val2", DBNull.Value)
Else
Command.Parameters.AddWithValue("@val2", MyValue)
End If
关于sql - 使用 ADO.NET 和 AddWithValue() 处理空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65566/