使用ADO.NET和AddWithValue()处理空值

dan*_*ays 3 sql vb.net ado.net

我有一个控件,在回发时,将表单结果保存回数据库.它通过遍历查询字符串来填充要保存的值.因此,对于以下SQL语句(为了讨论而大大简化)......

UPDATE MyTable
SET MyVal1 = @val1,
    MyVal2 = @val2
WHERE @id = @id
Run Code Online (Sandbox Code Playgroud)

...它会循环通过查询字符串键:

For Each Key As String In Request.QueryString.Keys
    Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key))
Next
Run Code Online (Sandbox Code Playgroud)

但是,我现在遇到的情况是,在某些情况下,这些变量中的某些变量可能不存在于查询字符串中.如果我不在querystring中传递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
Run Code Online (Sandbox Code Playgroud)

... 失败了.

攻击它的最佳方法是什么?我必须用RegEx解析SQL块,扫描查询字符串中不存在的变量名吗?或者,有更优雅的方法吗?

更新:检测VB代码隐藏中的空值会破坏将代码与其上下文分离的目的.我宁愿不为每个可能传递或不传递的可能变量的条件丢弃我的函数.

San*_*ken 9

首先,我建议不要在查询字符串上添加所有条目作为参数名称,我不确定这是不安全的,但我不会抓住这个机会.

问题是你在打电话

Command.Parameters.AddWithValue("@val2", null)
Run Code Online (Sandbox Code Playgroud)

而不是这个你应该打电话:

If MyValue Is Nothing Then
    Command.Parameters.AddWithValue("@val2", DBNull.Value)
Else
    Command.Parameters.AddWithValue("@val2", MyValue)
End If
Run Code Online (Sandbox Code Playgroud)

  • 我看到的最简洁的方法是:`Command.Parameters.AddWithValue("@ val2",(object)MyValue ??(object)DBNull.Value)` (5认同)