向 Sql Server 发送空参数

Posted

技术标签:

【中文标题】向 Sql Server 发送空参数【英文标题】:Sending null parameters to Sql Server 【发布时间】:2013-09-28 13:56:56 【问题描述】:

我有一个 SqlCommand 对象,我用它来更新数据库表,但它不能正确解释我的空值。

这里是 SQL:

UPDATE dbo.tbl 
SET param1 = @param1, 
param2 = @param2,
param3 = @param3,
param4 = @param4, 
param5 = @param5, 
param6 = @param6, 
param7 = @param7, 
param8 = @param8, 
param9 = @param9, 
param10 = @param10 
WHERE param11 = @param11

我已经尝试过像这样可以为空的空合并参数,但我没有任何成功。除非另有说明,否则所有参数都是字符串:

command.Parameters.AddWithValue("@param1", param1 ?? DBNull.Value);
command.Parameters.AddWithValue("@param2", param2 ?? DBNull.Value);
command.Parameters.AddWithValue("@param3", param3 ?? DBNull.Value);
command.Parameters.AddWithValue("@param4", param4 ?? DBNull.Value);
command.Parameters.AddWithValue("@param5", param5 ?? DBNull.Value);
// param6 is nullable type DateTime?
command.Parameters.AddWithValue("@param6", param6 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param7", param7 ?? DBNull.Value);
// param8 is nullable type DateTime?
command.Parameters.AddWithValue("@param8", param8 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param9", param9 ?? DBNull.Value);
// param10 nullable type float?
command.Parameters.AddWithValue("@param10", param10 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param11", param11 ?? DBNull.Value);

我遇到这样的异常:

The parameterized query '(@param1 nvarchar(4000),@param2 nvarchar(4000),@param3 nvarc' expects the parameter '@param4', which was not supplied.

我还尝试在将每个参数添加到 SqlCommand 对象后循环遍历每个参数以设置 DbNull.Value 如果参数值为 null,如下所示:

foreach (SqlParameter parameter in command.Parameters)

    if (parameter.Value == null)
    
        parameter.Value = DBNull.Value;
    

但是,这种方法会导致异常:

String or binary data would be truncated.
The statement has been terminated.

将空参数传递给SqlCommand 的最佳做法是什么?如果默认值为空,我不只是想传递默认值,因为数据库架构允许空值。

【问题讨论】:

param 是什么类型?你知道AddWithValue 必须从传递的对象推断类型吗?由于您没有收到编译时错误,因此假设 param 是对象,这不是一个好主意。 DBNull 实际上是为参数传递 NULL 的最佳实践(唯一方法)。您确定字符串截断错误不是由其他原因引起的吗?传递 NULL 不应导致此错误...也许尝试监视在您的数据库上执行的语句并尝试识别“真实”错误 我总共有 11 个参数,每个参数是字符串、日期时间或浮点数。我使用通用名称参数来伪装业务逻辑。 你能告诉我们完整的 SQL 吗? 我会尽快更新这个问题。出于某种原因,我的编辑不会发布。 【参考方案1】:

您好,请尝试使用以下语法:

command.parameters.add("@ParameterName",DBNull.value);

希望对你有帮助

【讨论】:

它实际上是 command.Parameters.Add("@ParameterName", DBNull.Value) 并且 SqlCommand.Parameters.Add 方法已被弃用。我是空值合并,因为有时值不是空值,我不想总是传递空值。 您是否已将参数声明为可为空? 我的大部分参数都是字符串,因此可以为空,但浮点数和日期时间的参数已明确定义为可空。【参考方案2】:

试试这个:

command.Parameters.AddWithValue("@param1", param1 ?? Convert.DBNull);

【讨论】:

这里的修复方法是什么? Convert.DBNull 等于 DBNull.Value【参考方案3】:
commandObject.Parameters.AddWithValue("@parameterName",Convert.DBNull);

【讨论】:

以上是关于向 Sql Server 发送空参数的主要内容,如果未能解决你的问题,请参考以下文章

使用带参数的SQL语句向数据库中插入空值

SQL Server存储过程中使用表值作为输入参数示例

SQL Server 执行速度因向内联表函数提供参数的方式而异

jquery-select2 总是在控制器中发送空参数

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

刷新页面时,php UPDATE发送到MYSQL空参数