我正在从类库项目调用一个存储过程。
command.CommandType = CommandType.StoredProcedure;myVariable为null,表列允许null。
我把存储的过程叫做这样:
command.Parameters.AddWithValue("myparam", myVariable);我得到了一个错误:
过程或函数需要未提供的参数“myparam”。
我设置了如下参数值:
command.Parameters.AddWithValue("@myparam", myVariable);而且起作用了。
为什么在参数之前放置@符号会影响命令?我在参数名称之前传递了许多没有@符号的参数,如果值不是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 ;发布于 2019-11-07 22:27:23
首先,不能将null作为参数值传递。如果要传递空值,则必须使用特殊对象DBNull.Value。您可以使用空合并运算符提供适当的DBNull值,如下所示:
command.Parameters.AddWithValue("myparam", myVariable ?? DBNull.Value);请注意,您的问题并没有明确说明myVariable变量的类型,因此编译器可能对空合并不满意:它可能会说:
接线员??不能应用于“某事”和“DBNull”类型的操作数。
因此,您还可能需要转换该特殊值,以便myVariable和它共享一个公共类型。最明显的解决方案是将其转换为object,因为这两种类型都将从中派生,因此您可以使用这两种方法中的任何一种:
command.Parameters.AddWithValue("myparam", myVariable ?? (object)DBNull.Value);
command.Parameters.AddWithValue("myparam", (object)myVariable ?? DBNull.Value);但是,正如我们能停止使用AddWithValue吗?中所指出的,不要止步于此。从使用AddWithValue转向使用类似的..。
command.Parameters.Add("@myparam", SqlDbType.DateTime).Value = myVariable ?? (object)DBNull.Value;(上面的示例是针对DateTime的,需要根据参数的类型进行调整)
https://stackoverflow.com/questions/51748183
复制相似问题