【问题标题】:Dapper: Not able to parse floats (Error parsing column)Dapper:无法解析浮点数(解析列时出错)
【发布时间】:2014-01-09 19:43:56
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 能否请您包含 dapper sql?是否使用存储过程、原始 sql 等
  • 我用代码更新了问题。
  • 你是如何从 proc 返回 SubTotal 的?
  • 我切换到使用OUTPUT 参数从proc 输出每一列,当cols 为NULL 时Dapper 给我Attempting to cast a DBNull to a non nullable type!,尽管列可以为空并且接受类具有可为空的字段。似乎 Dapper 认为 SubTotal 是 decimal,尽管它被定义为 decimal?。可空的 datetime 列也是如此。

标签: sql-server asp.net-mvc dapper


【解决方案1】:

似乎这不是 Dapper 特定的,因为我刚刚验证了下面的 sn-p 按预期工作。

尝试显式枚举列名(而不是选择 *),以便该过程准确返回应该映射到 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;
}

返回:

【讨论】:

  • 我不敢相信,但一切正常。今天开始VS,一切运行良好。根本没碰代码。我想那是那些日子之一......非常感谢您调查这个问题。
【解决方案2】:

别笑,但我在一个 ASP.NET MVC 项目中遇到了与 Dapper 完全相同的问题,而 @erdinger 的评论中的 解决方案 也对我有用:

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

问题就这样解决了……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多