【问题标题】:SubSonic: MySql, Float, and Single->Decimal issuesSubSonic:MySql、Float 和 Single->Decimal 问题
【发布时间】:2010-12-05 21:40:24
【问题描述】:

有 2 个 MySQL 数据库。一个是主数据库,另一个用于地理定位数据。现在,为了让 SubSonic 能够很好地通过 Subcommander 处理生成的文件,我让它变得简单,只是创建了一个映射到另一个数据库中的地理位置数据的视图(这样所有的表和地理位置数据在技术上都在一个数据库中)。

现在,我遇到的问题是: 在地理位置表中,有 2 个字段(纬度、经度)都是浮点数。

当我运行您的标准 SubSonic 语句来获取数据时:

return new Select()
            .From(ZipDatum.Schema)
            .Where(ZipDatum.Columns.Zipcode).IsEqualTo(zipCode)
            .ExecuteSingle<ZipDatum>();

我在我的测试项目中遇到了这个异常: “TestCanGetZipData”失败:System.ArgumentException:“System.Single”类型的对象无法转换为“System.Decimal”类型。

看起来 SubSonic 将浮点字段比作十进制。但是这个异常让我陷入了循环。有什么办法可以解决这个问题? FWIW,在所有其他 200 多个表中,我们对需要十进制的字段使用十进制。但由于这是第 3 方数据库表,因此他们使用的是浮点数,这会导致问题。

有人遇到这种情况吗?

【问题讨论】:

    标签: c# mysql subsonic subsonic2.2


    【解决方案1】:

    一种解决方案是使用 ExecuteTypedList 方法。

    1. 你必须创建一个 DTO 类:

      public class ZipDatumHelperClass
      {
          public int Id {get;set;}
          public string ZipCode {get;set;}
          public single Latitude {get;set;}
          public single Longitude {get;set;}
      }
      
    2. 将您的查询重写为

      List<ZipCodeHelperClass> result = new Select()
          .From(ZipDatum.Schema)
          .Where(ZipDatum.Columns.Zipcode).IsEqualTo(zipCode)
          .ExecuteTypedList<ZipDatumHelperClass>();
      

    ExecuteTypedList 方法是一种非常通用的方法,因为它尝试将 DataReader 中的列与您的类的属性相匹配。 它非常具体,因为它是

    区分大小写
    b 您的属性必须与 DataReader 返回的系统类型完全匹配

    让您的测试运行并修改结果,直到您没有收到任何错误。

    另一个解决方案是修改 SubSonic 源以生成视图 mysql 类型的单一系统类型。

    https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/DataProviders/MySqlDataProvider.cs

    public override DbType GetDbType(string mySqlType) { }
    

    从 mysqltype 中获取 DbType(为 decimal、float、newdecimal、numeric、double、real 创建十进制) 你必须在这里找出哪一个是错的,然后返回 DbType.Single。

    https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/Utility.cs

    public static string GetSystemType(DbType dbType) { }
    

    仅供参考:获取指定 DbType 的 System.Type。你不应该修改它。

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2015-01-07
      • 2023-03-07
      • 2013-01-04
      • 2023-03-06
      相关资源
      最近更新 更多