Dapper如何通过DynamicParameter.Get处理DBNull

时间:2015-09-30 01:52:27

标签: c# sql-server dapper

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

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

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

  

尝试将DBNull强制转换为非可空类型!请注意,在数据流完成之前(在查询的'foreach'之后(...,buffered:false),或者在为QueryMultiple处理了GridReader之后,out / return参数将没有更新的值)

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

count = param.Get<int?>("MsgId");

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

2 个答案:

答案 0 :(得分:1)

感谢Paulius,尝试使用动态数据类型     count = param.Get<dynamic>("MsgId");它可以像我正在寻找的那样工作。

答案 1 :(得分:0)

在我的情况下,这是由于存储过程中的 Id 参数设置为 IN ,最后,我还将其值设置为 LAST_INSERT_ID( ),而在我的C#(Dapper代码)中,它是 ParameterDirection.InputOutput

我将存储的proc ID设置为 INOUT 后,问题得到解决。

简而言之,据我了解, Id 参数行为(IN / OUT / INOUT)应该在两个位置(即存储的proc和C#中)同步。