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

标签 sql vb.net ado.net

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

相关文章:

c# - 加载数据源时应用程序窗口挂起

sql - 如何在 RODBC 的 SQLquery 中使用求和函数

sql - 为什么在 SQL Azure 上运行查询速度如此之慢?

VB.NET 在窗体之间传递数据

vb.net - 在动态创建的子菜单项上添加单击事件

vb.net - 根据单元格值的数量更改DataGridView中的行颜色

.net - 如何将生成的方法标记为过时?

excel - 使用 OleDbConnection::GetOleDbSchemaTable() 列出 excel 表

mysql - 复杂的 MYSQL 从 5 个表中选择

php - T_CONSTANT_ENCAPSED_STRING QUERY PHP