SubSonic:MySql,Float和Single->十进制问题

时间:2010-12-04 00:00:09

标签: c# mysql subsonic subsonic2.2

拥有2个MySQL数据库。一个是主数据库,另一个是地理定位数据。现在,为了让SubSonic通过Subcommander与生成的文件保持良好的关系,我轻松地创建了一个映射到另一个数据库中的地理位置数据的视图(这样,所有表和地理位置数据在技术上都在一个数据库中)。 / p>

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

当我运行标准的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多个表中,我们对需要这样的字段使用十进制。但由于这是第三方数据库表,因此它们使用浮动并导致问题。

有人遇到这种情况吗?

1 个答案:

答案 0 :(得分: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>();
    
  3. 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创建decimal) 你必须弄清楚哪一个错了,然后返回DbType.Single。

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

    public static string GetSystemType(DbType dbType) { }
    

    FYI:获取指定DbType的System.Type。你不应该修改它。