C# 如何通过DynamicParameter.Get处理DBNull var param=new DynamicParameters(); param.Add(“MsgId”,DbType.Int32,方向:ParameterDirection.Output); 执行(MessageSelOutMessageId,param,commandType:commandType.storedProcess); count=参数Get(“MsgId”);

C# 如何通过DynamicParameter.Get处理DBNull var param=new DynamicParameters(); param.Add(“MsgId”,DbType.Int32,方向:ParameterDirection.Output); 执行(MessageSelOutMessageId,param,commandType:commandType.storedProcess); count=参数Get(“MsgId”);,c#,sql-server,dapper,C#,Sql Server,Dapper,通过引用Dapper,我使用上面的代码调用带有输出参数-MsgId的存储过程。它工作正常,但在某些情况下,存储过程不会返回任何值,并且返回的输出参数值将为null。在这些情况下,我得到了一个例外: 正在尝试将DBNull强制转换为不可为Null的类型!请注意,在数据流完成之前(在查询的“foreach”之后(…,buffered:false),或者在为QueryMultiple释放GridReader之后),out/return参数将不会有更新的值 我知道我们可以使用下面的代码将返回数据类型标记

通过引用Dapper,我使用上面的代码调用带有输出参数-MsgId的存储过程。它工作正常,但在某些情况下,存储过程不会返回任何值,并且返回的输出参数值将为null。在这些情况下,我得到了一个例外:

正在尝试将DBNull强制转换为不可为Null的类型!请注意,在数据流完成之前(在查询的“foreach”之后(…,buffered:false),或者在为QueryMultiple释放GridReader之后),out/return参数将不会有更新的值

我知道我们可以使用下面的代码将返回数据类型标记为null,以避免此错误

var param = new DynamicParameters();
param.Add("MsgId", DbType.Int32, direction: ParameterDirection.Output);

connection.Execute(MessageSelOutMessageId, param, commandType: CommandType.StoredProcedure);
count = param.Get<int>("MsgId");
count=param.Get(“MsgId”);

但是,有没有其他方法来检查param.Get(“MsgId”)==null而不是使用可为null的数据类型-int?

谢谢Paulius,尝试了使用动态数据类型
count=param.Get(“MsgId”)和我正在寻找的一样工作。

在我的例子中,这是由于存储过程中的Id参数在中被设置为,最后,我还将其值设置为last\u INSERT\u Id(),而在我的C#(简洁的代码)中,它被设置为参数direction.InputOutput

在我将存储的进程ID设置为INOUT
后,问题得到了解决


简言之,我所理解的是,Id参数行为(In/OUT/INOUT)应该在存储过程和C#中同步。

可能
param.Get(“MsgId”)==null
?你能尝试DBNull.Value而不是null吗,这两个是不同的
count = param.Get<int?>("MsgId");