簡體   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