SQL客户端AddWithValue空参数不带@符号

时间:2018-08-08 13:39:09

标签: c# sql-server stored-procedures

我正在从类库项目中调用存储过程。

command.CommandType = CommandType.StoredProcedure;

myVariable为空,并且表列允许为空。

我这样称呼存储的过程:

command.Parameters.AddWithValue("myparam", myVariable);

我收到此错误:

  

过程或函数需要未提供的参数'myparam'。

我这样设置参数值:

command.Parameters.AddWithValue("@myparam", myVariable);

它有效。

为什么在参数前加@符号会影响命令?我在参数名称前传递了很多没有@符号的参数,并且如果value不为null,它们可以工作。

Sp内容:

ALTER PROCEDURE [dbo].[medilit_sp_trnx_reports_insert]
    (@paramID BIGINT,
     @myparam NVARCHAR(1000)
    )
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO trnx_reports(paramID, myparam)
    VALUES (@paramID, @myparam);

    SELECT SCOPE_IDENTITY();
END ;

1 个答案:

答案 0 :(得分:0)

首先,您不能将null作为参数值传递。如果要传递空值,则必须使用特殊对象DBNull.Value。您可以使用null合并运算符提供正确的DBNull值,如下所示:

command.Parameters.AddWithValue("myparam", myVariable ?? DBNull.Value);

请注意,您的问题并未明确说明myVariable变量的类型是什么,因此编译器可能对null表达式不满意:它可能会说:

  

操作员“ ??”不能应用于“ something ”和“ DBNull”类型的操作数。

因此,您可能还需要强制转换该特殊值,以使myVariable与它共享一个公共类型。最明显的解决方案是强制转换为object,因为两种类型都将从中派生,所以您可以使用以下任意一种方法:

command.Parameters.AddWithValue("myparam", myVariable ?? (object)DBNull.Value);
command.Parameters.AddWithValue("myparam", (object)myVariable ?? DBNull.Value);

但是,如can we stop using AddWithValue所示,不要就此停下来。从使用AddWithValue转向使用类似...

command.Parameters.Add("@myparam", SqlDbType.DateTime).Value = myVariable ?? (object)DBNull.Value;

(上面的示例用于DateTime,并且需要根据参数的类型进行调整)