如何处理DBNull由DynamicParameter.Get

本文关键字:DBNull DynamicParameter Get 处理 何处理 | 更新日期: 2023-09-27 18:15:24

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的存储过程。它工作得很好,但是在某些情况下,存储过程将不返回任何值,并且返回的输出参数值将为空。在这些情况下,我得到了这个异常:

试图将DBNull转换为非空类型!请注意,输出/返回参数将不会有更新的值,直到数据流完成(在查询的'foreach'之后)…(buffered: false),或者在GridReader已经被QueryMultiple处理后)

我知道我们可以通过使用

下面的代码将返回数据类型标记为可空来避免这个错误
count = param.Get<int?>("MsgId");

但是,是否有其他方法来检查param.Get("MsgId") == null而不是使用可空数据类型- int?

如何处理DBNull由DynamicParameter.Get

谢谢Paulius,尝试使用动态数据类型count = param.Get<dynamic>("MsgId");和它的工作,因为我正在寻找

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

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

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

你知道通过添加nullable int并将其转换为int nullable来处理绑定值null:

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