Dapper:无法解析浮点数(解析列时出错)

6

我正在使用Dapper从StoredProcedure检索SQL Server中的数据,但出现错误

指定的转换无效。

错误详细信息:

解析列4时出错(SubTotal=0.00 - Decimal)

在SQL Server端,列SubTotaldecimal(18, 2) NULLABLE,在.NET端则是decimal?。检索到的数据为0.00

我查看了这个答案:Dapper,decimal to double? Error parsing column X

根据答案,我替换了第2360行的

il.Emit(OpCodes.Ldtoken, unboxType);

il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);

但仍然出现相同的错误。

有人对此有任何想法吗?谢谢。

更新:

我尝试将列设置为非空。还尝试将列更改为float(在SQL Server上)和double(在.NET端)。但是这些都没有起作用,我一直收到同样的错误。然后我将列更改为int,现在代码可以正常工作。但是,我正在处理货币价值,并希望使用浮点数。将进一步调查...
我执行以下存储过程: var transaction = this.db.Query<PaymentTransactions>("usp_PaymentTransactionsGetSingleIfPaid", new { registrationId }, commandType: CommandType.StoredProcedure); 返回信息的存储过程如下: SELECT * FROM PaymentTransactions WHERE RegistrationId = @registrationId AND TransactionStatus = 'SUCCESS'; 更新2: Dapper正常工作。也许我的开发环境有问题。只需要重新启动VS即可。

请问您能否包含Dapper SQL?您是使用存储过程、原始SQL还是其他方式? - nathan_jr
我已经更新了问题并附上了代码。 - sakura-bloom
你是如何从过程中返回SubTotal的? - nathan_jr
我改用OUTPUT参数从存储过程中输出每一列,但当列为NULL时,Dapper会报错Attempting to cast a DBNull to a non nullable type!,尽管这些列是可空的,并且接受类具有可空字段。看起来Dapper认为SubTotal是decimal类型,尽管它被定义为decimal?。对于可空的datetime列也是如此。 - sakura-bloom
2个回答

3

不要笑,但我在一个ASP.NET MVC项目中遇到了与Dapper完全相同的问题,@erdinger评论中提供的解决方案也适用于我:

  • 关闭Visual Studio
  • 重新启动Visual Studio

通过这种方式解决了问题...


2

看起来这不是 Dapper 特定的问题,因为我刚验证了下面的代码片段可以正常工作。

尝试显式枚举列名(而不是 select * ),以便该过程返回应映射到 PaymentTransactions 的确切内容。可能有另一个非十进制列被错误命名了?

这是在 .Net45 上使用 Dapper v1.13:

过程:

create procedure dbo.Test
as
select  [SubTotal] = cast('0.01' as decimal(18,2)) 
union all 
select null;

Linqpad:

void Main()
{
    using (IDbConnection cnn = GetOpenConnection())
    {
        var users = cnn.Query<Sale>("yak.dbo.test", new { }, commandType: CommandType.StoredProcedure);
        users.Dump();

    }
}

public static readonly string connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=True";

public static IDbConnection GetOpenConnection()
{
  var connection = new SqlConnection(connectionString);
  connection.Open();
  return connection;
}

public class Sale
{
   public decimal? SubTotal;
}

Returns:

enter image description here


2
我简直不敢相信,但一切都正常工作了。今天启动了VS,一切都运行良好。我根本没有碰代码。我想这是那些幸运的日子之一...非常感谢您关注此问题。 - sakura-bloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接