DbType UInt64 无法映射到已知的 SqlDbType。Dapper C#

5

我们的SQL Server 2016数据库中有一个表字段(TotalPrice),数据类型是numeric(20, 3)

我在C#中使用了ulong类型作为属性类型。

public ulong TotalPrice { get; set; }

当我想在我的表中插入一条记录时,出现了以下异常。

没有从DbType UInt64到已知的SqlDbType的映射

我的C#代码用于插入一条记录:
const string queryInsertInvoice = @"
INSERT INTO Invoice (CustomerId, Number, TotalPrice, LatestStatusDateTime) 
VALUES (@CustomerId, @Number, @TotalPrice, @LatestStatusDateTime)
SELECT SCOPE_IDENTITY();";

var invoiceId = await dbConnection.QueryFirstOrDefaultAsync<int>(queryInsertInvoice, invoice);

我该如何处理使用Dapper 2.0.53遇到的这个问题?

3个回答

9
这是有意为之的。SQL Server 没有无符号整数,所以它试图防止您将数据存储为与预期不同的内容 - 对于相等操作,环绕运算很好,但如果允许这种情况,则不等式操作对于某些值会表现得非常出乎意料。
换句话说:使用 long 而不是 ulong
编辑:我可以接受"Dapper 应该允许使用前 63 位的 ulong,并将其强制转换为 long - 如果设置了 MSB,则抛出异常 (OverflowException?)。"只是今天还没有实现。

5

我宁愿使用长名称TotalPriceInCent并将价格存储为分,这是我在过去几年中处理货币问题的经验。 - Roar S.

0
当我使用Dapper时,我所做的是从我的主模型创建单独的数据类,这些类表示来自SQL的结果。对于这些SqlModel类,我确保类型与SQL中的表示完全一致。在我的C#业务逻辑中,通常更容易使用int或枚举类型作为变量,而它们在SQL中可能是TINYINT。因此,我最终会得到两个类,如下所示:
class UserSqlModel {
  public string Name { get; set; }
  public byte UserTypeId { get; set; }
}

class User {
  public string Name { get; set; }
  public UserType Type { get; set; }
}

然后我会编写两个模型之间的映射函数。这将使您的业务逻辑与 SQL 中数据表示的细微差别隔离开来,允许单独重构业务逻辑或 SQL 实现。
在您的示例中,也许您的 SqlModel 会有一个 long 属性,而您的映射函数将处理 ulong 到 long 的转换,并处理溢出问题。

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