Дозвуковы: MySQL, Float и Single-> Десятичные проблемы
-
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» не может быть преобразован в тип «System.Decimal».
Похоже, что дозвуковыжимаются полей Float до десятичных. Но это исключение бросает меня на петлю. Любой способ обойти это? FWIW, на всех остальных 200 столах 200+ мы используем десятичные для наших полей, которые требуют таких. Но поскольку это 3-я сторонняя таблица базы данных, они используют Float и это вызывает проблемы.
Кто-нибудь столкнулся с этой ситуацией?
Решение
Одно решение было бы использовать метод 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 является очень общим подходом, поскольку он пытается сопоставить столбцы от VatAreader к свойствам вашего класса. Это очень специфично, так как это
чувствительный к регистру
B Ваши свойства должны соответствовать именному типу системного, полученного по DataReader
Просто пусть ваш тест запускается и измените результат, пока не получите никаких ошибок.
Другое решение было бы изменением дозвукового источника для генерации типа системы Single для видов MySQL типа.
https://github.com/subsonic/subsonic--.0/blob/master/subsonic/dataProviders/mysqldataProvider.cs.
public override DbType GetDbType(string mySqlType) { }
Получайте dbtype из mysqltype (десятичное десятичное время создано для десятичных, поплавок, newdecimal, числовых, двойных, реальных). Вы должны выяснить, какой здесь неправильный, и вместо этого вернуть dbtype.single.
https://github.com/subsonic/subsonic--.0/blob/master/subsonic/utity.cs.
public static string GetSystemType(DbType dbType) { }
FYI: получите систему .Type для указанного dbtype. Вы не должны изменять это.