Russian Qt Forum

Qt => Базы данных => Тема начата: BaltikS от Июль 15, 2009, 18:11



Название: PSQL и MCBC [РЕШЕНО]
Отправлено: BaltikS от Июль 15, 2009, 18:11
Был успешно скомпилен Qt-4.5.2 под чудо ось МСВС, скомпилен драйвер из SDK Линтера 6.0. Казалось бы - всё чудесно... Но случайно обнаружил, что тип double (тип в БД) или real - округляется до целого...при выборе из query.value(x).toDouble(). Ну и никак не побороть... Пока решилось заменой поля в БД double на varchar, но понимаю, что это не выход... Кто поможет советом?
Заранее благодарю за внимание!


Название: Re: PSQL и MCBC
Отправлено: sLiva от Июль 15, 2009, 22:17
Был успешно скомпилен Qt-4.5.2 под чудо ось МСВС, скомпилен драйвер из SDK Линтера 6.0. Казалось бы - всё чудесно... Но случайно обнаружил, что тип double (тип в БД) или real - округляется до целого...при выборе из query.value(x).toDouble(). Ну и никак не побороть... Пока решилось заменой поля в БД double на varchar, но понимаю, что это не выход... Кто поможет советом?
Заранее благодарю за внимание!

Проблема аналогичная, началась с версии 4.5.0
Откатились на 4.4.3 там все норм.
Советую откатываться, в базе менять типы совсем не вариант, будем ждать, в новых версиях может починят...


Название: Re: PSQL и MCBC
Отправлено: BaltikS от Июль 16, 2009, 10:51
Нашёл временное решение проблемы. Без пересборки драйвера увы, не обойтись...
1) Ищем файл qsql_psql.cpp
2) Со строки 321 по строку 338 комментируем следующие строки...
Код
C++ (Qt)
case QVariant::Double:
   /*    if (ptype == QNUMERICOID) {
           if (d->precisionPolicy != QSql::HighPrecision)*/
{
               QVariant retval;
               bool convert;
/*                if (d->precisionPolicy == QSql::LowPrecisionInt64)
                   retval = QString::fromAscii(val).toLongLong(&convert);
               else if (d->precisionPolicy == QSql::LowPrecisionInt32)
                   retval = QString::fromAscii(val).toInt(&convert);
               else if (d->precisionPolicy == QSql::LowPrecisionDouble)*/

                   retval = QString::fromAscii(val).toDouble(&convert);
               if (!convert)
                   return QVariant();
               return retval;
           }
/*            return QString::fromAscii(val);
       }
       return strtod(val, 0);*/

 
 
пусть это кривовато, зато временно работает :)