LINUX.ORG.RU

[Qt4][ODBC][FreeTDS] Нет результата от запроса

 


0

0

Здравствуйте! Это опять я.

Недавно мигрировал с OpenSuSE 11.2 на Kubuntu последнюю или предпоследнюю :) В OpenSuSE проект мой работал как положено с MS SQL Server'ом (ну кроме прошлого бага), по совету Тролльтеховцев для работы со строками перекомпилировал libqt4-sql-odbc с поддержкой ODBC версии 2 вместо 3. Сделал то же и в Kubuntu, но работать не стало.

odbc.ini содержит правильный DSN, через isql коннекчусь нормально и выполняю команды, из проекта нифига и через demos/sqlbrowser тоже нифига. Запрос select * from Databases ничего не возвращает, хотя там несколько записей. При выполнении оного sqlbrowser выводит заголовки полей из этой таблицы, то есть какой-то обмен с сервером происходит. При этом ни на что не ругается. setForwardOnly(true).

Уже не знаю, в какую сторону копать, всё вроде перерыл. наведите на какую-нибудь мысль!

Заранее благодарен.

PS: в обоих системах qt4.5.2, ODBC 2.2, FreeTDS 0.82. SQL Server 2005, версия протокола 8.0

★★★★

#ifdef USE_ODBC
#ifdef _WIN32
   QString driver = «{SQL Server}»;
   QString options = "";
#else
   QString driver = «FreeTDS»;
   QString options = «TDS_Version=7.0;Port=1433;»;
#endif
   QSqlDatabase db = QSqlDatabase::addDatabase(«QODBC»);
   QString DSN = QString(
         «DRIVER=%1;»
         «SERVER=%2;»
         «UID=%3;»
         «PWD=%4;»
         «DATABASE=%5;%6»)
         .arg(driver)
         .arg(server.isNull() ? databaseServer() : server)
         .arg(username.isNull() ? databaseUsername() : username)
         .arg(password.isNull() ? databasePassword() : password)
         .arg(databaseName.isNull() ? database() : databaseName)
         .arg(options);
   qDebug() << DSN;
   db.setDatabaseName(DSN);
#else
   QSqlDatabase db = QSqlDatabase::addDatabase(«QTDS»);
   db.setHostName(server.isNull() ? databaseServer() : server);
   db.setDatabaseName(databaseName.isNull() ? database() : databaseName);
   db.setUserName(username.isNull() ? databaseUsername() : username);
   db.setPassword(password.isNull() ? databasePassword() : password);
#endif
   db.open();

Т.е. я не стал использовать ODBC для MSSQL server. Через QTDS все работает хорошо.

olegk ★★
()
Ответ на: комментарий от olegk

> Т.е. я не стал использовать ODBC для MSSQL server. Через QTDS все работает хорошо.

Опа-опа-опа-па, у тебя локаль UTF-8? Как себя ведут Model/View с таблицами на MS SQL'е? Через ODBC у меня записывает в левой кодировке, хоть всё что надо и выставляю.

Да, а TDS_Version=8.0 пробовал?

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

cat /etc/freetds/freetds.conf
# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage «man freetds.conf».

# Global settings are overridden by those in a database
# server specific section
[global]
# TDS protocol version
   tds version = 7.0

   # Whether to write a TDSDUMP file for diagnostic purposes
   # (setting this to /tmp is insecure on a multi-user system)
   dump file = /tmp/freetds.log
   debug flags = 0xffff
   debug level = 10


   # Command and connection timeouts
;   timeout = 10
;   connect timeout = 10
   
   # If you get out-of-memory errors, it may mean that your client
   # is trying to allocate a huge buffer for a TEXT field.
   # Try setting 'text size' to a more reasonable limit
   text size = 64512

;   client charset = UTF-8

[HOMESERVER]
   host = 192.168.0.200
   port = 1433
   tds version = 7.0
   instance = SQLEXPRESS

olegk ★★
()
Ответ на: комментарий от Ay49Mihas

SELECT выбирает все как надо. Что касается update/insert пока сказать не могу. Не было такой задачи. Пересборка ODBC даже select не сделала нормальным. Локаль UTF-8 само собой.

olegk ★★
()
Ответ на: комментарий от olegk

Ну у меня всё так же. На OpenSuSE работает, на Ubuntu неа :) Подозреваю чото в самой qt, но как проверить --- ума не приложу.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от olegk

ubuntu 10.4 ты как перекомпилировал Qt4 с TDS? В debian/rules в вызов configure добавил -plugins-sql-tds, или ещё что-то?

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от olegk

> Через QTDS все работает хорошо.

Кстати, заметил особенность (а может, плохо смотрел), что в дистрибутивах Debian, Ubuntu, Mandriva (мож и в других) появились бинарные сборки libqt4-sql-tds тока с версии 4.6.x, а раньше не было. Это с чем-нибудь связано именно в Qt 4.6.x (по сравнению с 4.5.х и ниже), или просто прозрение мейнтейнеров?

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

Так, вроде компилится, тока потребовался freetds-dev

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от olegk

> Т.е. я не стал использовать ODBC для MSSQL server. Через QTDS все работает хорошо.

Сделал так же. Если вариант USE_ODBC, но пользоваться DSN'ом с параметрами, то делает всё так же, как DSN без параметров с отдельно заданными параметрами (см. первое сообщение).

Если использовать чистый QTDS, то вываливается с ошибкой, код которой намекает мне, что версия TDS 4.2, а мне нужно 8.0.

Поэтому вопрос: как можно при использовании QTDS задать номер версии TDS (протокола)?

Заранее благодарен!

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

> Поэтому вопрос: как можно при использовании QTDS задать номер версии TDS (протокола)?

Тьфу, разобрался. В db.setHostName надо передавать не IP или хостНаме, а имя записи в freetds.conf. Теперь всё заработало :)

Спасибо!

PS: А ODBC само себе злобное буратино.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

А ещё QTDS у меня возвращает очень длинные строки :(

Ay49Mihas ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.