有2个MySQL数据库。一个是主要数据库,另一个用于地理位置数据。现在,为了让子语音通过子司令部使用生成的文件播放,我使它变得容易,只是创建了一个视图,该视图将其他数据库中的地理位置数据映射到地理位置数据(这样,所有表和地理位置数据在技术上都在一个数据库中)。

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

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

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

我在我的测试项目中得到了此例外:“ testCangetzipdata”失败:system.argumentException:类型'system.single'的对象不能转换为type'system.decimal'。

看起来像是亚音速比喻为十进制。但是这个例外是让我循环。有什么办法解决这个问题吗? fwiw,在所有其他200多个表上,我们都使用小数点用于需要此类的字段。但是,由于这是第三方数据库表,因此他们使用的是float,这引起了问题。

有人遇到这种情况吗?

有帮助吗?

解决方案

一种解决方案是使用执行型列表方法。

  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所述的系统类型完全匹配

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

另一个解决方案是修改亚音速源以生成视图mySQL类型的系统类型单。

https://github.com/subsonic/subsonic-2.0/blob/master/subsonic/dataproviders/mysqledataprovider.cs

public override DbType GetDbType(string mySqlType) { }

从mysqltype中获取dbType(为小数,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的系统。您不应该修改它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top