C# 不存在从DbType UInt64到已知SqlDbType的映射。衣冠楚楚

C# 不存在从DbType UInt64到已知SqlDbType的映射。衣冠楚楚,c#,sql-server,dapper,C#,Sql Server,Dapper,我在SQL Server 2016数据库中有一个表fieldTotalPrice,数据类型为numeric20,3 我使用ulong类型作为我的C属性类型 public ulong TotalPrice { get; set; } 当我想在我的表中插入一条记录时,发生了以下异常 不存在从DbType UInt64到已知SqlDbType的映射 插入记录的My C代码: const string queryInsertInvoice = @" INSERT INTO Invoice (

我在SQL Server 2016数据库中有一个表fieldTotalPrice,数据类型为numeric20,3

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

public ulong TotalPrice { get; set; }
当我想在我的表中插入一条记录时,发生了以下异常

不存在从DbType UInt64到已知SqlDbType的映射

插入记录的My 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 Server没有无符号整数,因此它试图阻止您将数据存储为与预期不同的内容-对于相等操作,wraparound是可以的,但是如果我们允许,对于某些值,不等操作的行为将非常意外

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


编辑:我可以在Dapper上出售,应该允许ulong的前63位-强制它为long-和throw和exception OverflowException?如果已设置MSB。这在今天还没有实现。

只需将TotalPrice类型更改为decimal即可

public decimal TotalPrice { get; set; }

当我使用Dapper时,我要做的是从我的主模型中创建单独的数据类,这些数据类表示SQL的结果。使用这些SqlModel类,我确保类型与SQL中的表示方式完全一致。在我的C业务逻辑中,对于SQL中可能很小的变量,通常更容易使用int或enum。所以我最终会上两门课,像这样:

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的转换,并处理溢出问题。

我宁愿使用long并重命名为TotalPriceInCent,并以美分存储价格。只是我过去几年在货币方面的经验。