【问题标题】:Dapper How to Handle DBNull by DynamicParameter.GetDapper 如何通过 DynamicParameter.Get 处理 DBNull
【发布时间】:2015-12-27 16:09:59
【问题描述】:
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 转换为不可为空的类型!请注意,在数据流完成之前(在 Query(..., buffered: false 的 'foreach' 之后,或在为 QueryMultiple 释放 GridReader 之后),out/return 参数不会有更新的值)

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

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

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

【问题讨论】:

  • 可能是param.Get&lt;dynamic&gt;("MsgId") == null?
  • 能不能试试用DBNull.Value代替null,这两个不一样

标签: c# sql-server dapper


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2021-08-20
      • 2011-01-26
      相关资源
      最近更新 更多