Russian Qt Forum

Qt => Базы данных => Тема начата: hamlo от Декабрь 16, 2009, 12:43



Название: Qt+ODBC+CAST
Отправлено: hamlo от Декабрь 16, 2009, 12:43
Подключаемся так
Код:
QSqlDatabase dbfdb = QSqlDatabase::addDatabase("QODBC", "dbfcon");
QString dbfDriver;
dbfDriver = "DRIVER={Microsoft dBase Driver (*.dbf)};FIL={dBase IV;};DefaultDir="+dbfDirPath;
dbfdb.setDatabaseName(dbfDriver);
dbfdb.open();
return dbfdb.isOpen();

выполняем такой запрос
Код:
QString queryText ="SELECT CAST(N_KMS AS INT) FROM TABLENAME"
query.exec(queryText);

получаем
Цитировать
[Microsoft][Драйвер ODBC dBase] Ошибка синтаксиса (пропущен оператор) в выражении запроса 'CAST(N_KMS AS INT)'

при использовании
Код:
QString queryText ="SELECT CONVERT(INT, N_KMS) FROM TABLENAME"
query.exec(queryText);

получаем
Цитировать
[Microsoft][Драйвер ODBC dBase] Неопределенная функция 'CONVERT' в выражении.

Что делать? Где я не прав...


Название: Re: Qt+ODBC+CAST
Отправлено: Пантер от Декабрь 16, 2009, 12:47
Это не сюда вопрос, ищи синтаксис SQL для ODBC. Сразу предупреждаю, он шизанутый по полной программе. А с dbf вообще тяжело работать. Если есть индексный файл, то подключится не сможешь.


Название: Re: Qt+ODBC+CAST
Отправлено: hamlo от Декабрь 16, 2009, 12:50
Не от хорошей жизни таким онанизмом занимаюсь - надо написать модуль для совместимости со старой фоксовой софтиной...
Поэтому, если кто может помочь - отпишитесь плз - весь гугле излазил уже... =(


Название: Re: Qt+ODBC+CAST
Отправлено: lit-uriy от Декабрь 16, 2009, 14:30
>>SELECT CAST(N_KMS AS INT) FROM TABLENAME
честно говоря я тоже не понимаю этой записи, что ты пытаешься сделать?


Название: Re: Qt+ODBC+CAST
Отправлено: hamlo от Декабрь 16, 2009, 14:48
мне надо тип numeric преобразовать к char (или int) в запросе. Как это сделать? А сделать это надобно, потому что слишком большое число в поле numeric, операция SELECT в тандартном MS ODBC драйвере возвращает значение как double в научном формате 0xбла-блаE+степень, преобразование которой назад в число происходит с потерей разрядов (функция QString::numeric).


Название: Re: Qt+ODBC+CAST
Отправлено: Пантер от Декабрь 16, 2009, 14:59
Я работаю с dbf постоянно. На ODBC давно забил из-за убогости реализации SQL. Я написал конвертер в PostgreSQL и с ним работаю. Можно легко переделать для SQLite.
Еще есть класс для прямой работы с dbf, но там SQL нету, т.е. фильтровать данные нужно будет вручную. Кстати, как раз проблему нумерика я обошел конвертом его в double при числе знаков после запятой больше 18.
Если интересно, могу сюда выложить решение.


Название: Re: Qt+ODBC+CAST
Отправлено: lit-uriy от Декабрь 16, 2009, 15:10
CAST, если мне не изменяет память, используется в выражении WHERE, опреатора SELECT.

Теперь ещё непонятки:
>>мне надо тип numeric преобразовать к char (или int) в запросе.
>>преобразование которой назад в число происходит с потерей разрядов

первое требование (к INT), уничтожит всё что после запятой
тогда второе замечание совершенно не понятно.


Название: Re: Qt+ODBC+CAST
Отправлено: hamlo от Декабрь 16, 2009, 15:12
Кстати, как раз проблему нумерика я обошел конвертом его в double при числе знаков после запятой больше 18.
Если интересно, могу сюда выложить решение.

Как раз то, о чем я говорю. Да интересно, SQL как раз не является обязательным. Выложите пожалуйста. С нетерпением жду.


Название: Re: Qt+ODBC+CAST
Отправлено: Пантер от Декабрь 16, 2009, 17:07
Отправил на мыло.


Название: Re: Qt+ODBC+CAST
Отправлено: arial от Декабрь 16, 2009, 19:47
CAST(N_KMS AS INTEGER)


Название: Re: Qt+ODBC+CAST
Отправлено: hamlo от Декабрь 17, 2009, 11:38
Изучил софтину. Свои задачи реализовал. Понял во всей красе, что MS реализация ODBС гумно (начитавшись вдоволь об ограничениях в MS ODBC http://msdn.microsoft.com/en-us/library/ms710252%28VS.85%29.aspx и наплевательского отношения со стороны MS ко всем стандартам... в том числе и к своим - впечатление, что писать под Windows хуже, чем под разные ядра Linux...). Так как для работы есть необходимость реализации многих функции FoxPro, на основании полученного кода (моральная стимуляция =) ) буду пилить собственный НОРМАЛЬНЫЙ драйвер.

ЗЫ
Жалко мне становится разработчиков только под Windows =))