Russian Qt Forum

Qt => Базы данных => Тема начата: InternalsInside от Декабрь 11, 2005, 17:54



Название: Qt + ODBC = Driver not loaded
Отправлено: InternalsInside от Декабрь 11, 2005, 17:54
Здравствуйте,
 Вот такая проблемка возникла... Поставил себе вчера Qt, начал доки читать и по мелочи эксперементировать. Сегодня захотел поэксперементировать с БД. И возникло несколько вопросов.

Главный вопрос: Пишу такой код:
Код:
QSqlDatabase db = QSqlDatabase::addDatabase ("QODBC3");

После чего lastError() возвращает ошибку driver not loaded. Вопрос как его загрузить?

Вопрос номер2:
Чтобы работать с sql классами qt пришлось в настройках проекта в разделе linker указать еще либу qtsql4.lib - мне всегда так придется вручную подключать нужные либы или как-то можно автоматизировать?

Заранее спасибо.[/code]


Название: Qt + ODBC = Driver not loaded
Отправлено: Dendy от Декабрь 12, 2005, 14:02
Відповідь 1:
Подивись будь ласка тут, може це та сама проблема:
http://prog.org.ru/forum/topic_2141.html

Відповідь 2:
Бібліотеки на пальцях порахувати можна. Прийдеться підмикати руцями, не такий й гемор. :)  В інтеграторі на початку проекту можна вибрати які заюзати ліби.


Название: Qt + ODBC = Driver not loaded
Отправлено: mistake от Август 26, 2006, 20:35
Ситуация: QT 4.1.4 + VS 2005. Подсоединяюсь к базе Access при помощи
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=" + FileName);

Полет нормальный - коннект проходит, вижу какие есть таблицы в этой базе...

Проблема: при попытке сделать запрос при помощи
Код:
// Запрашиваем кол-во записей
query.exec("select count(*) from table");
if (!query.isActive())
{
QMessageBox::warning(0, "Database Error", query.lastError().text());
}
вылетает указанный QMessageBox с надписью "Driver not loaded Driver not loaded"!

Как такое может быть и что сие означает? Демонстрация SQL Browser нормально отрабатывает и отображает содержимое таблиц. Где глюк?

добавлено спустя 4 часа 56 минут:

 заметил в окне debug сообщение
Код:
'dbtool.exe': Loaded 'C:\WINDOWS\system32\odbcji32.dll', Cannot find or open a required DBG file.
Подозреваю, что проблема именно в этом, поскольку эта dll-ка вроде как входит в состав Microsoft Jet 4. Самое интересное, что файл преспокойно находится себе в папке windows/system32. В чем же проблема?

добавлено спустя 7 минут:

 Но вот чего я вообще не понимаю так это вот это:
1) почему прога коннектится к базе и дает возможность получить список таблиц в ней, но не дает выполнить запрос?
2) почему открытая в VS 2005 демонстрашка "SQL Browser" работает с этой же базой на ура?


Название: Qt + ODBC = Driver not loaded
Отправлено: DenKor от Август 28, 2006, 08:13
Скорее всего у тебя в path раньше указаны другие версии qt или файлы баз jet не той версии.
Которые скомпилированы без поддержки баз данных.

У меня тоже была такая фигня


Название: Qt + ODBC = Driver not loaded
Отправлено: mistake от Август 28, 2006, 09:11
И эта "фигня" как-то решилась? Возможно проблема в том, что у меня стоит офис версии 2003 SBE (в составе него отсутствует MS Access), но я поставил поверх этого офиса MS Access из поставки MS Office 2003 Pro....


Название: Qt + ODBC = Driver not loaded
Отправлено: DenKor от Август 28, 2006, 14:01
заметил в окне debug сообщениеКод:
'dbtool.exe': Loaded 'C:\WINDOWS\system32\odbcji32.dll', Cannot find or open a required DBG file.

Это он ругается на отсутствии отладочных символов для библиотеки. Можно забить.

Посмотри в окне  debug твои ли библиотеки qt подгружаются при загрузки проги. У тебя могут подгружаться библиотеки из другой версии.

Попробуй сам пересобери библиотеки odbc.

>>почему открытая в VS 2005 демонстрашка "SQL Browser" работает с этой же >>базой на ура?
Если эта демонтсрашка не вылетает на твоем операторе, то смотри опции соединения базы данных


Название: Qt + ODBC = Driver not loaded
Отправлено: mistake от Август 29, 2006, 20:53
Цитата: "DenKor"
Посмотри в окне  debug твои ли библиотеки qt подгружаются при загрузки проги. У тебя могут подгружаться библиотеки из другой версии.

А как это посмотреть? По путям? Но я оставил только одну версию QT, остальные снес - так что это вряд ли является проблемой.

Цитата: "DenKor"
Попробуй сам пересобери библиотеки odbc.

Это как? Microsoft Jet я ведь собрать не смогу...

Цитата: "DenKor"
>>почему открытая в VS 2005 демонстрашка "SQL Browser" работает с этой же >>базой на ура?
Если эта демонтсрашка не вылетает на твоем операторе, то смотри опции соединения базы данных

Смотрел. Ничего интересного не выявил... Придется еще раз копать код... :-(
Подозреваю, что проблема все-таки в том, что у меня в настоящий момент две версии MS Office (SBE и PRO), попробую оставить одну...


Название: Qt + ODBC = Driver not loaded
Отправлено: zuxul от Ноябрь 22, 2006, 12:27
Итак, проблема над которой я ломаю голову уже второй день.
 :(
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:

Перечитал почти все топики(то что выдал мне поиск) форума на эту проблему...

Положил скомпиленный драйвер($QTDir\plugins\sqldrivers\qsqlodbc.dll) в папку sqldrivers рядом с прогой, не помогло. Может я не правильно его компилировал...Не подскажите как правильно это сделать.
Уставновливал дистрибутивы из этих файлов:
MinGW-3.4.2.exe
qt-win-opensource-4.1.2-mingw.exe
компилирую в MinGW.

Пожалуйста ответьте мне, на пару глупый вопросов.
1. Можно ли использовать QODBC без переконфигурации и новой сборки QT?
2. Собственно, если можно то как?
3. При запуске QT-шного примера, sql-браузера, при выборе QODBC драйвера, вываливается такая ошибка в окошке:
An error ocured while opening the connection: [Microsoft][Диспечер драйверов ODBC] Источ... - дальше не видно. Может это у меня что-то с компутером?


Название: Qt + ODBC = Driver not loaded
Отправлено: BaltikS от Ноябрь 22, 2006, 14:05
Ответ простой, Qt - не видет драйвера. Я собирал QT VC6. И вот что я заметил с плагинами.... Если просто тупо копировать Qt с плагинами с одной машины на другую в тот же каталог - работают плагины.... Если любой другой, то плагины не видны.

1. Если версии QT совпадают и пути одинаковые - можно.
2. Использовать DLL qt-mtxxx.dll вместе с плагином, там где он был собран (для Qt3).
3. без коментариев...


Название: Qt + ODBC = Driver not loaded
Отправлено: zuxul от Ноябрь 22, 2006, 22:31
Извините, не описал сути проблемы, не загружается драйвер на машине, где установлен QT.
SQL Browser - из примеров QT, работает только с QSQLite драйвером...
Цитата: "BaltikS"
Ответ простой, Qt - не видет драйвера.

Как заставить QT (или мою прогу?) увидеть его?


Название: Qt + ODBC = Driver not loaded
Отправлено: Mixolap от Ноябрь 24, 2006, 18:35
Сконфигурируй сборку с дровами odbc.
Под винду:

configure -qt-sql-odbc
mingw32-make


Название: Qt + ODBC = Driver not loaded
Отправлено: Dendy от Ноябрь 24, 2006, 21:09
Ещё солюшн - потереть ветку реестра:

Код:
HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults


Название: Qt + ODBC = Driver not loaded
Отправлено: Tonal от Ноябрь 25, 2006, 12:43
Про расположение плагинов, и других файлов читать в ассистенте про qt.conf
Если кратко, то можно в директории проги создать каталог plugins, в нём подкаталог sqldrivers и туда ложить qsqlodbc.dll.


Название: Qt + ODBC = Driver not loaded
Отправлено: zuxul от Ноябрь 29, 2006, 01:12
Спасибо за помощь. Дело как всегда оказалось в кривых руках.
Делал все в тестовом режиме - в консоли - оказывается (!!! :-) ) надо создавать QApplication, чтобы все нормально работало.


Название: Qt + ODBC = Driver not loaded
Отправлено: Sidrian от Ноябрь 29, 2006, 17:05
У меня похожая проблема. Когда компилю программу с функцией
int connectDB()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
        db.setDatabaseName("qttest");
   db.setUserName("qttest");
   db.setPassword("100000");
        if (!db.open())
           return 0;
   return 1;
}
все классно работает. Но стоит поместить эту функцию в ДЛЛ пишет
QSlqlDatabase: QODBC Driver not loaded.
А мне оно нужно именно в ДЛЛ потому что идея в том чтобы использовать это из С кода, где инклуд с такой функцией, естественно, не скомпилиться.
Хотел вручную инстанцировать QODBCDriver. В мануале сказанно, что для этого надо инклудить соответствующий файл из qtdir/src/sql/drivers/. У меня в каталоге srz нет папки sql.
Qt ver 4.2.0 evaluation for MSVS 2003.

добавлено спустя 1 час:

 Скачал сорс Qt там есть файл qtdir/src/sql/drivers/odbc/qsql_odbc.cpp котый в мануале сказано инклудить. В ответ аолучаю тучу ворнингов о "inconsistent dll linkage" и пару ошибок "unresolved external".


Название: Qt + ODBC = Driver not loaded
Отправлено: Mixolap от Ноябрь 29, 2006, 17:09
Поставь нормальную версию, если тебя заказчик не ограничивает конечно.
http://www.trolltech.com/download?target=http://ftp.iasi.roedu.net/mirrors/ftp.trolltech.com/qt/source/qt-win-opensource-4.2.1-mingw.exe


Название: Qt + ODBC = Driver not loaded
Отправлено: Sidrian от Ноябрь 29, 2006, 17:41
У меня есть опен сорс версия но мне не очень хочется разбираться с тем, как все это шастие к CodeBlock прикрутить(я знаю что на эту тему есть кучу тредов, но простого негеморойного пути я нигде не нашел). И я не думаю что просто кину этот же сорс в mingw и все заработает. Или я не прав?


Название: Qt + ODBC = Driver not loaded
Отправлено: Sidrian от Ноябрь 30, 2006, 12:01
Неужели никто не может подсказать в чем проблема с таким длл? Если ктото поможет на примере такой простой функции, тому мегареспект :)
Код:

extern "C"  __declspec(dllexport) int __stdcall connectDB()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
      db.setDatabaseName("qttest");
db.setUserName("qttest");
db.setPassword("pwd");
      if (!db.open())
        return 0;
return 1;
}

Очень нужно!
ЗЫ Если ре хотите колупаться с QODBC поставьте место него QSQLITE. В ДЛЛ при любом выборе драйвера пишет "Driver not loaded" хоть убейся.


Название: Qt + ODBC = Driver not loaded
Отправлено: Tonal от Ноябрь 30, 2006, 12:55
А QApplication у тебя когда создаёться?


Название: Qt + ODBC = Driver not loaded
Отправлено: Sidrian от Ноябрь 30, 2006, 14:40
Для уверености написал таку вот дурню в ДЛЛ:
Код:

bool WINAPI DllMain(HANDLE hinstDll, DWORD dwReason, LPVOID lpvReserved)
{
int argc = 2; char *argv[2] = { "test", "app" };
switch (dwReason) {
case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH:
QCoreApplication(argc, argv);
return true;
break;
default:
return true;
break;
}
return false;
}

Не помогает.


Название: Qt + ODBC = Driver not loaded
Отправлено: Dendy от Ноябрь 30, 2006, 16:25
Естественно не помогает - QCoreApplication сразу же убивается. Даже не при вьІходе из DllMain, а после отработки конструктора. Создавай его в куче.

Тут такой вопрос вьІлезает, тьІ ету DLL только из Qt программ собираешься юзать или из любой?


Название: Qt + ODBC = Driver not loaded
Отправлено: Sidrian от Ноябрь 30, 2006, 18:51
В том то и идея. Мне нужно вызывать эту функцию из С кода. Я делаю библиотеку для работы с БД, но колупаца с ODBC не хотелось (правда после знакомства с Qt начинает хотеться :). Меня впринципе предупреждали что у Qt много своих мрачных приколов, но я думал что не все так плохо...

добавлено спустя 1 час 57 минут:

 Проблема отпала сама собой благодаря стиранию Qt и установке SQLAPI++ :)


Название: Qt + ODBC = Driver not loaded
Отправлено: Tonal от Декабрь 01, 2006, 08:37
Цитата: "Sidrian"
Для уверености написал таку вот дурню в ДЛЛ:
Код:

bool WINAPI DllMain(HANDLE hinstDll, DWORD dwReason, LPVOID lpvReserved)
{
int argc = 2; char *argv[2] = { "test", "app" };
switch (dwReason) {
case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH:
QCoreApplication(argc, argv);
return true;
break;
default:
return true;
break;
}
return false;
}

Не помогает.

Класс!
Берём учебник, читаем про локальные переменные.

Цитата: "Sidrian"
у Qt много своих мрачных приколов

Самый мрачный прикол Qt, это то, что надо знать С++!
А с таким знанием которое ты показал - действительно, Qt никуда не годиться.
Как и любые другие библиотеки для С++! ;-)