【问题标题】:No mapping exists from DbType UInt64 to a known SqlDbType. Dapper C#不存在从 DbType UInt64 到已知 SqlDbType 的映射。小巧玲珑的 C#
【发布时间】:2020-08-22 01:10:24
【问题描述】:

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

【问题讨论】:

    标签: c# sql-server dapper


    【解决方案1】:

    这是故意的。 SQL Server 没有无符号整数,因此它试图阻止您将数据存储为与您预期不同的数据 - 环绕对于 equality 操作来说很好,但不等式操作的行为会非常意外一些值,如果我们允许的话。

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


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

    【讨论】:

      【解决方案2】:

      只需将 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

      【讨论】:

      • 我宁愿使用 long 并重命名为 TotalPriceInCent 并以美分存储价格。只是我过去几年在货币方面的经验。
      【解决方案3】:

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

      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 属性,而您的映射函数将处理ulonglong 的转换并处理溢出问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        相关资源
        最近更新 更多