1

有 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 方数据库表,他们正在使用浮点数,这会导致问题。

有人遇到这种情况吗?

4

1 回答 1

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 中的列与您的类的属性进行匹配。它非常具体,因为它是

a 区分大小写
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。你不应该修改它。

于 2010-12-05T13:40:24.283 回答