[英]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.