拥有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多个表中,我们对需要这样的字段使用十进制。但由于这是第三方数据库表,因此它们使用浮动并导致问题。
有人遇到这种情况吗?
答案 0 :(得分:1)
一种解决方案是使用ExecuteTypedList方法。
您必须创建一个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 重新调整的系统类型完全匹配让测试运行并修改结果,直到没有出现任何错误。
另一个解决方案是修改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。你不应该修改它。