将空参数发送到Sql Server

Cam*_*ker 4 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
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

我得到这样的例外:

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

我已经尝试循环遍历每个参数后,如果参数值为null,则将它们添加到SqlCommand对象以设置DbNull.Value:

foreach (SqlParameter parameter in command.Parameters)
{
    if (parameter.Value == null)
    {
        parameter.Value = DBNull.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

将null参数传递给a的最佳做法是SqlCommand什么?我不只是想传递默认值,如果它们为null,因为数据库模式允许空值.

Gau*_*123 24

试试这个 :

command.Parameters.AddWithValue("@param1", param1 ?? Convert.DBNull);
Run Code Online (Sandbox Code Playgroud)

  • 解决办法是什么?`Convert.DBNull`等于`DBNull.Value` (2认同)

Sai*_*ash 5

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

command.parameters.add("@ParameterName",DBNull.value);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助