首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有@符号的sign空参数

没有@符号的sign空参数
EN

Stack Overflow用户
提问于 2018-08-08 13:39:09
回答 1查看 328关注 0票数 0

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

代码语言:javascript
复制
command.CommandType = CommandType.StoredProcedure;

myVariable为null,表列允许null。

我把存储的过程叫做这样:

代码语言:javascript
复制
command.Parameters.AddWithValue("myparam", myVariable);

我得到了一个错误:

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

我设置了如下参数值:

代码语言:javascript
复制
command.Parameters.AddWithValue("@myparam", myVariable);

而且起作用了。

为什么在参数之前放置@符号会影响命令?我在参数名称之前传递了许多没有@符号的参数,如果值不是null,它们就能工作。

Sp内容:

代码语言:javascript
复制
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 ;
EN

Stack Overflow用户

回答已采纳

发布于 2019-11-07 22:27:23

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

代码语言:javascript
复制
command.Parameters.AddWithValue("myparam", myVariable ?? DBNull.Value);

请注意,您的问题并没有明确说明myVariable变量的类型,因此编译器可能对空合并不满意:它可能会说:

接线员??不能应用于“某事”和“DBNull”类型的操作数。

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

代码语言:javascript
复制
command.Parameters.AddWithValue("myparam", myVariable ?? (object)DBNull.Value);
command.Parameters.AddWithValue("myparam", (object)myVariable ?? DBNull.Value);

但是,正如我们能停止使用AddWithValue吗?中所指出的,不要止步于此。从使用AddWithValue转向使用类似的..。

代码语言:javascript
复制
command.Parameters.Add("@myparam", SqlDbType.DateTime).Value = myVariable ?? (object)DBNull.Value;

(上面的示例是针对DateTime的,需要根据参数的类型进行调整)

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51748183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档