SubSonic: MySql, Float и Single-> Decimal - PullRequest
1 голос
/ 04 декабря 2010

Имеют 2 базы данных MySQL.Одна является основной базой данных, другая используется для данных геолокации.Теперь, чтобы SubSonic хорошо играл с сгенерированными файлами через Subcommander, я упростил это и просто создал представление, которое сопоставляется с данными геолокации в другой базе данных (таким образом, все таблицы и данные геолокации технически находятся в одной базе данных).

Теперь проблема, с которой я сталкиваюсь, заключается в следующем: в таблице геолокации есть два поля (широта, долгота), которые оба являются плавающими.

Когда я запускаю ваш стандартный оператор 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+ таблицах мы используем десятичные числа для наших полей, которые требуют такого.Но поскольку это сторонняя таблица базы данных, они используют float и это вызывает проблемы.

Кто-нибудь сталкивался с такой ситуацией?

1 Ответ

1 голос
/ 05 декабря 2010

Одним из решений было бы использование метода ExecuteTypedList.

  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

Просто дайте запустить тест и изменяйте результат, пока не получите никаких ошибок.

Другим решением было бы модифицировать источник SubSonic для генерации единого системного типа для представлений типа mysql.

https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/DataProviders/MySqlDataProvider.cs

public override DbType GetDbType(string mySqlType) { }

получает тип DbType из mysqltype (десятичное число создается для десятичного, с плавающей запятой, нового десятичного, числового, двойного, вещественного) Вы должны выяснить, какой из них здесь неправильный, и вместо этого вернуть DbType.Single.

https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/Utility.cs

public static string GetSystemType(DbType dbType) { }

FYI: получить System.Type для указанного DbType. Вы не должны изменять это.

...