我正在从类库项目中调用存储过程。
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 ;
答案 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,并且需要根据参数的类型进行调整)