[英]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; }
当我使用 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 将处理ulong
到long
的转换并处理溢出问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.