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

时间:2014-01-09 19:43:57

标签: 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端为decimal?。检索的数据是0.00

我检查了这个答案:Dapper,decimal to double? Error parsing column 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重启。

2 个答案:

答案 0 :(得分: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;
}

返回:

enter image description here

答案 1 :(得分:1)

不要笑,但我在ASP.NET MVC项目中遇到了与Dapper完全相同的问题,并且@erdinger的评论中的解决方案也为我工作:

  • 关闭Visual Studio
  • 再次启动Visual Studio

这个问题已经解决了......