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

nom*_*mad 5 sql-server asp.net-mvc dapper

我正在使用Dapper从StoredProcedure检索SQL Server中的数据,我收到错误

Specified cast is not valid.

和细节:

Error parsing column 4 (SubTotal=0.00 - Decimal)

在SQL Server端,列SubTotaldecimal(18, 2) NULLABLE在.NET端,而在.NET端decimal?.正在检索的数据是0.00.

我检查了这个答案:Dapper,十进制加倍?解析列X时出错

根据答案,我换了

il.Emit(OpCodes.Ldtoken, unboxType);

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

在2360行仍然得到相同的错误.

任何人对此都有任何想法?谢谢.

更新:

我试过让列不可为空.还尝试将列更改为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重启.

Nat*_*erl 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;
Run Code Online (Sandbox Code Playgroud)

林克垫:

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;
}
Run Code Online (Sandbox Code Playgroud)

返回:

在此输入图像描述

  • 我简直不敢相信,但一切都运转良好。今天启动VS一切正常。根本没有碰过代码。我想那是那些日子之一......非常感谢您研究这个问题。 (2认同)