【问题标题】:How do I get Dapper to ignore invalid data?如何让 Dapper 忽略无效数据?
【发布时间】:2019-07-11 16:22:01
【问题描述】:

我正在使用 Dapper 加载 int? 值。 int? 的值存储在 SQL Server 数据库的 VARCHAR 列中(我无法更改)。有时该列包含包含字母字符的无效数据。

发生这种情况时,我会看到以下错误:

Error parsing column 5 (Foo=ABC123 - String) ---> System.FormatException: Input string was not in a correct format.

如何让 Dapper 忽略无效值并改用 null?

【问题讨论】:

    标签: sql-server dapper


    【解决方案1】:

    您可以修改您的 SQL 以在 SQL Server 本身上相应地解析和返回值。这样,您的调用代码就不会发生任何变化。

    我会做类似的事情:

    select case when isnumeric(foo) = 1 then foo else null end foo from table;
    

    【讨论】:

      【解决方案2】:

      Dapper 是简单的映射器;它不会为您进行这种数据类型转换。你必须做一个把戏。

      我能看到的唯一(坏)选项是在您的类中包含 string 属性并将 dapper 映射到该属性而不是您的 int? 属性。然后将int? 属性映射到string 属性,并在其间添加一些处理代码。

      public class MyTable
      {
          public string MyColumn {get;set;}//Map dapper to this property
          public int? MyColumnInt //<-- Do NOT map this to dapper. Do not implement setter
          {
              get
              {
                  int temp;
                  if(int.TryParse(MyColumn, out temp) == true)
                      return temp;
                  else
                      return null;
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        Accepted answer(来自@DanB)很好,但可以改进。

        如果您使用的是现代版本的 SQL Server(2012 或更高版本),请考虑使用 TRY_CAST 而不是 ISNUMERICISNUMERIC 的行为方式可能出乎您的意料。请参考this问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-06
          • 1970-01-01
          • 2021-11-04
          • 2021-04-13
          • 1970-01-01
          • 2020-05-24
          • 1970-01-01
          • 2014-11-12
          相关资源
          最近更新 更多