当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用ADO.NET和AddWithValue()处理空值》经验,为你挑选了1个好方法。

我有一个控件,在回发时,将表单结果保存回数据库.它通过遍历查询字符串来填充要保存的值.因此,对于以下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

但是,我现在遇到的情况是,在某些情况下,这些变量中的某些变量可能不存在于查询字符串中.如果我不在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

... 失败了.

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

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



1> Sander Rijke..:

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

问题是你在打电话

Command.Parameters.AddWithValue("@val2", null)

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

If MyValue Is Nothing Then
    Command.Parameters.AddWithValue("@val2", DBNull.Value)
Else
    Command.Parameters.AddWithValue("@val2", MyValue)
End If


我看到的最简洁的方法是:`Command.Parameters.AddWithValue("@ val2",(object)MyValue ??(object)DBNull.Value)`
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有