c# - 向 SQL Server 发送空参数

标签 c# sql sql-server null-coalescing-operator null-coalescing

我有一个用于更新数据库表的 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

我试过像这样可以为 null 的 null 合并参数,但我没有取得任何成功。除非另有说明,否则所有参数均为字符串:

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 对象后循环遍历每个参数,以便在参数值为 null 时设置 DbNull.Value,如下所示:

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 的最佳做法是什么?我不想简单地传入默认值(如果它们为空),因为数据库模式允许空值。

最佳答案

试试这个:

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

关于c# - 向 SQL Server 发送空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963178/

相关文章:

sql - 将 SQL 数据拆分为月份

sql - 将 DateTIME 转换为 Date/"int is not allowed"错误

c# - 此算法的 base64 编码盐/密码的最大长度

sql-server - 业务层与 SQL Server

c# - 在两个集合中搜索

c# - 如何获取字典中的前 N ​​个(百分比)值?

c# - EF Core - 用于处理特定类型的全局设置

c# - 完全隐藏 GridView 中的元素(用作 ListView 的 View )?

mysql - 仅获取 2 个结果,每个结果对应具体字段的不同值

sql - 基于 SQL Server 参数值的条件 WHERE