繁体   English   中英

不存在从 DbType UInt64 到已知 SqlDbType 的映射。 小巧玲珑 C#

[英]No mapping exists from DbType UInt64 to a known SqlDbType. Dapper C#

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

我使用ulong类型作为我的 C# 属性类型。

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 处理这种情况?

这是故意的。 SQL 服务器没有无符号整数,因此它试图阻止您将数据存储为与您预期不同的数据 - 环绕对于相等运算很好,但如果我们允许,对于某些值,不相等运算会表现得非常意外。

换句话说:使用long ,而不是ulong


编辑:我可以出售“Dapper 应该允许ulong用于前 63 位 - 将其强制为long - 如果设置了 MSB,则抛出异常( OverflowException ?)”。 这只是今天没有实施。

只需将 TotalPrice 类型更改为小数。

public decimal TotalPrice { get; set; }

https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver15

当我使用 Dapper 时,我所做的是从我的主要 model 创建单独的数据类,它们代表 SQL 的结果。 使用这些SqlModel类,我确保类型与 SQL 中的事物表示方式完全一致。 在我的 C# 业务逻辑中,在 SQL 中它们可能是TINYINT的变量通常更容易使用int或枚举。 所以我最终会得到两个这样的类:

class UserSqlModel {
  public string Name { get; set; }
  public byte UserTypeId { get; set; }
}

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

然后我会在两个模型之间写一个映射 function 。 这将您的业务逻辑与 SQL 中数据表示方式的细微差别隔离开来,并允许分别重构您的业务逻辑或 SQL 实现。

在您的示例中,您的SqlModel可能会有一个long属性,而您的映射 function 将处理ulonglong的转换并处理溢出问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM