サブソニック:mysql、float、および単一> 10進の問題
-
08-10-2019 - |
質問
2つのMySQLデータベースがあります。 1つはメインデータベースで、もう1つはジオロケーションデータに使用されます。これで、SubsonicがSubcommanderを介して生成されたファイルをうまく再生するために、私はそれを簡単にし、他のデータベースのジオロケーションデータをマップするビューを作成しました(そのため、すべてのテーブルとジオロケーションデータは技術的に1つのデータベースにあります)。
さて、私が遭遇している問題は次のとおりです。ジオロケーションテーブルには、両方ともフロートである2つのフィールド(緯度、長所)があります。
データを取得するために標準の亜音速ステートメントを実行したとき:
return new Select()
.From(ZipDatum.Schema)
.Where(ZipDatum.Columns.Zipcode).IsEqualTo(zipCode)
.ExecuteSingle<ZipDatum>();
テストプロジェクトでこの例外を取得します:「testcangeTzipdata」失敗:System.ArgumentException:タイプのオブジェクト 'System.Single'は、「System.decimal」タイプに変換できません。
亜音速はフロートフィールドを小数点に並べているようです。しかし、この例外は私をループに投げかけています。これを回避する方法はありますか? FWIWは、そのようなフィールドに小数を使用している他の200以上のテーブルのすべてで。しかし、これはサードパーティのデータベーステーブルであるため、フロートを使用しており、問題を引き起こしています。
誰かがこの状況に遭遇しますか?
解決
解決策の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あなたのプロパティは、データリーダーによって保持されているシステムタイプに正確に一致する必要があります
エラーが発生しなくなるまで、テストを実行して結果を変更してください。
別の解決策は、亜音源を変更して、ビューのMySQLタイプのシステムタイプシングルを生成することです。
https://github.com/subsonic/subsonic-2.0/blob/master/subsonic/dataproviders/mysqldataprovider.cs
public override DbType GetDbType(string mySqlType) { }
MySqlTypeのDBTypeを取得します(小数は、小数点、float、newdecimal、umolic、double、real用に作成されます)。
https://github.com/subsonic/subsonic-2.0/blob/master/subsonic/utility.cs
public static string GetSystemType(DbType dbType) { }
参考までに、指定されたDBTYPEのSystem.Typeを入手してください。それを変更してはいけません。