亚音速:mysql,float和单>十进制问题
-
08-10-2019 - |
题
有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,这引起了问题。
有人遇到这种情况吗?
解决方案
一种解决方案是使用执行型列表方法。
您必须创建DTO类:
public class ZipDatumHelperClass { public int Id {get;set;} public string ZipCode {get;set;} public single Latitude {get;set;} public single Longitude {get;set;} }
将您的查询重写为
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的系统。您不应该修改它。