Russian Qt Forum

Qt => Базы данных => Тема начата: bai от Май 13, 2007, 23:13



Название: Драйвер базы данных в Qt 4
Отправлено: bai от Май 13, 2007, 23:13
В тексте программы пытаюсь подключиться к базе данных:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setDatabaseName("db1");
db.setUserName("user");
db.setPassword("password");
db.open();

После сборки при запуске программы на консоль выдается следующее:

QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers:
QSqlQuery::exec: database not open

Что делаю неправильно? Система FreeBSD 6.2, Qt 4.2.3 установлено из портов.


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 13, 2007, 23:38
драйвер пересобрать и положить  в .\sqldrivers


Название: Драйвер базы данных в Qt 4
Отправлено: Karl-Philipp от Май 13, 2007, 23:52
а как это пересобрать драйвер? У меня та же проблема, только с MySql.


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 14, 2007, 00:48
1. Ставишь MySql. Обычно становится он в c:\mysql.
2. Идешь в инсталляцию Qt\src\plugins\sqldrivers\mysql\
(например, это может быть C:\QT\4.2.2\src\plugins\sqldrivers\mysql).
3. Делаешь qmake, потом nmake.
4. В C:\QT\4.2.2\plugins\sqldrivers\ должен появиться файлик C:\QT\4.2.2\plugins\sqldrivers\qsqlmysql.dll, его то и копируешь в подкаталог .\sqldrivers твоего приложения.

Какие могут быть грабли... Возможно, надо будет указать путь к mysql.h в путях компилятора (обычно к C:\mysql\include\) и к либе в путях линкера (C:\mysql\lib\opt\libmySQL.lib).
Также придется кинуть C:\mysql\lib\opt\libmySQL.dll  в каталог с твоей ехе-хой.


Название: Драйвер базы данных в Qt 4
Отправлено: an9bit от Май 14, 2007, 01:35
У меня таже проблема с FreeBSD 6.2, QT 4.2.3 и QMYSQL
%./mysql
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers:

Пробовал добавлять QTPLUGIN += qsqlmysql в файл проекта, получается ещё хуже, но хоть что-то видно. Может вы сможите помочь определить чего не хватает для сборки.

mysql.pro
Код:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
CONFIG += qt debug plugin
QT += sql
QTPLUGIN += qsqlmysql
# Input
HEADERS += qsql.h
SOURCES += main.cxx


main.cxx
Код:
#include <QApplication>
#include "qsql.h"
int main(int argc, char *argv[]){
        QApplication app(argc, argv);
        sqltmp db;
        return app.exec();
}


qsql.h
Код:
#ifndef aa_
#define aa_
#include <QSqlDatabase>
#include <QWidget>
class sqltmp : public QWidget {
        Q_OBJECT
        public:
                sqltmp(QWidget *parent=0):QWidget(parent){
                        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
                }
};
#endif


При сборки происходит следующее
Код:
an9bit@bithome% qmake-qt4 -spec freebsd-g++
an9bit@bithome%make
++ -c -pipe -g -Wall -W  -DQT_PLUGIN -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/QtCore -I/usr/local/include/QtCore -I/usr/local/include/QtGui -I/usr/local/include/QtGui -I/usr/local/include/QtSql -I/usr/local/include/QtSql -I/usr/local/include -I. -I. -I. -I/usr/local/include -o main.o main.cxx
/usr/local/bin/moc-qt4 -DQT_PLUGIN -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/QtCore -I/usr/local/include/QtCore -I/usr/local/include/QtGui -I/usr/local/include/QtGui -I/usr/local/include/QtSql -I/usr/local/include/QtSql -I/usr/local/include -I. -I. -I. -I/usr/local/include qsql.h -o moc_qsql.cpp
c++ -c -pipe -g -Wall -W  -DQT_PLUGIN -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/share/qt4/mkspecs/freebsd-g++ -I. -I/usr/local/include/QtCore -I/usr/local/include/QtCore -I/usr/local/include/QtGui -I/usr/local/include/QtGui -I/usr/local/include/QtSql -I/usr/local/include/QtSql -I/usr/local/include -I. -I. -I. -I/usr/local/include -o moc_qsql.o moc_qsql.cpp
c++ -pthread -o mysql main.o  moc_qsql.o    -L/usr/local/lib -lQtSql -L/usr/local/lib -pthread -pthread -lQtGui -L/usr/X11R6/lib -laudio -lXt -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lglib-2.0 -liconv -L/usr/local/lib/plugins/sqldrivers/ -lqsqlmysql
/usr/local/lib/plugins/sqldrivers//libqsqlmysql.so: undefined reference to `QMYSQLDriver::staticMetaObject'
/usr/local/lib/plugins/sqldrivers//libqsqlmysql.so: undefined reference to `vtable for QMYSQLDriver'
*** Error code 1

Подскажите в какую сторону копать пожалуйста. Уже сума схожу, не знаю что делать. 2 дня мучаюсь с этой проблемой.

Нашел ещё такую вот информацию, но разобраться не смог http://lists.trolltech.com/qt-interest/2007-03/thread01218-0.html


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 14, 2007, 10:46
надо собрать сам плугин.
проект в Qt\src\plugins\sqldrivers\mysql.
зайди туда. сделай qmake и make.


Название: Драйвер базы данных в Qt 4
Отправлено: an9bit от Май 14, 2007, 11:20
Racheengel, Qt - это дириктория установки или какая?


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 14, 2007, 11:31
да, именно так
например, c:\qt\4.2.3
я помню, тоже долго долбался с mySql, пока не догадался драйвер перекомпилить.
Дело в том, что если меняешь версию мускля, то надо соответствующий драйвер иметь. Только для этой версии собранный заново.


Название: Драйвер базы данных в Qt 4
Отправлено: zlatko от Май 14, 2007, 11:31
Цитата: "an9bit"
Racheengel, Qt - это дириктория установки или какая?

Угу, она же cис переменная $(QTDIR)


Название: Драйвер базы данных в Qt 4
Отправлено: an9bit от Май 14, 2007, 11:40
Ура! Я это сделал! Спасибо большое Racheengel и zlatko.
Если у кого-то будут такие проблемы с freebsd то вот ршение:

Если библиотека qt4 установлена из портов
#cd /tmp && tar xf /usr/ports/distfiles/KDE/qt-x11-opensource-src-4.2.3.tar.gz
#cd qt-x11-opensource-src-4.2.3/src/plugins/sqldrivers/mysql
#qmake-qt4 -spec freebsd-g++
добавляем в Makefile в INCPATH путь к библиотекам mysql (-I/usr/local/include/mysql)
#make
плагин сразу ствится /plugins/sqldriver
копируем вирикторий sqldriver в папку своего проекта и все должно заработать.
Ещё раз огромное спасибо Racheengel.
Также выражаю свою благодаронсть товарисчу redbeard.


Название: Драйвер базы данных в Qt 4
Отправлено: bai от Май 14, 2007, 11:52
Так получается что в каждый проект нужно копировать драйвера?
Зачем тогда они устанавливаются в /usr/local/lib/plugins/sqldriver?


Название: Драйвер базы данных в Qt 4
Отправлено: Karl-Philipp от Май 14, 2007, 15:41
Цитата: "Racheengel"
1. Ставишь MySql. Обычно становится он в c:\mysql.
2. Идешь в инсталляцию Qt\src\plugins\sqldrivers\mysql\
(например, это может быть C:\QT\4.2.2\src\plugins\sqldrivers\mysql).
3. Делаешь qmake, потом nmake.
4. В C:\QT\4.2.2\plugins\sqldrivers\ должен появиться файлик C:\QT\4.2.2\plugins\sqldrivers\qsqlmysql.dll, его то и копируешь в подкаталог .\sqldrivers твоего приложения.

Также придется кинуть C:\mysql\lib\opt\libmySQL.dll  в каталог с твоей ехе-хой.


1. Поставил MySql (С:\MySql)

2. В консоли выполнил:

cd %QTDIR%\src\plugins\sqldrivers\mysql
        qmake -o Makefile "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MySQL\lib\opt\libmysql.lib" mysql.pro
        nmake

3. Из %QTDIR%\plugins\sqldrivers взял файлик qsqlmysql.dll и скопировал его в каталог sqldrivers, который создал в каталоге проекта. На всякий случай сделал такой же (sqldrivers) каталог в каталоге с ехе-шником.

4. А также кинул файлик C:\mysql\lib\opt\libmySQL.dll в каталог с ехе-хой.

В конце компиляции программы - окошко "Database Error" с сообщением driver not loaded driver not loaded
Подскажите, пожалуйста, как быть?


версия Qt 4.1.4.

файл проекта

CONFIG += qt
QT += sql
SOURSES += main.cpp

код:

Код:
#include <QtSql>
#include <QApplication>
#include <QMessagebox>

bool createConnection();

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
if (!createConnection())
return 1;

return app.exec();
}


 
bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("base");
db.setUserName("username");
db.setPassword("password");
if (!db.open()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
}


Название: Драйвер базы данных в Qt 4
Отправлено: an9bit от Май 14, 2007, 16:18
to bai
Теперь я уже не знаю зачем они ставятся. Ибо этот файл qsqlmysql.so скопировал в /usr/local/lib/plugins/sqldrivers и в дирикторию проэкта добовлять его не надо. Видать плагины как-то косячно собираются.


Название: Драйвер базы данных в Qt 4
Отправлено: bai от Май 14, 2007, 20:54
Спасибо всем ответившим. Помогла пересборка драйвера.
Хотя считаю странным тот факт, что происходит кривая сборка драйвера при установке из портов.


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 14, 2007, 21:40
Karl-Philipp:

Цитировать

В конце компиляции программы - окошко "Database Error" с сообщением driver not loaded driver not loaded


Это окошко при компиляции появиться не может - только при выполнении приложения.

Также непонятно вот это:

Цитировать

взял файлик qsqlmysql.dll и скопировал его в каталог sqldrivers, который создал в каталоге проекта. На всякий случай сделал такой же (sqldrivers) каталог в каталоге с ехе-шником.


Что есть каталог проекта? Надо создавать sqldrivers в каталоге с exe-файлом программы.
Вообще по идее все сделано верно, должно работать.

bai:
Да нет, просто драйвер необходимо пересобирать под конкретную версию MySql. При инсталляции это не проверяется.


Название: Драйвер базы данных в Qt 4
Отправлено: bai от Май 14, 2007, 23:31
Racheengel:

Цитировать

bai:
Да нет, просто драйвер необходимо пересобирать под конкретную версию MySql. При инсталляции это не проверяется.


Вот как раз при инсталляции, если в системе не установлен клиент соответствующей СУБД, устанавливается нужный клиент как зависимость.
Я имею ввиду установку из портов во FreeBSD.


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 14, 2007, 23:41
Цитировать

устанавливается нужный клиент как зависимость


Цитировать

установку из портов


Не понял, честно говоря, о чем речь.


Название: Драйвер базы данных в Qt 4
Отправлено: bai от Май 14, 2007, 23:49
Цитата: "Racheengel"
Цитировать

устанавливается нужный клиент как зависимость


Цитировать

установку из портов


Не понял, честно говоря, о чем речь.

Речь идет об установке софта, в частности Qt 4.2.3, из портов во FreeBSD


Название: Драйвер базы данных в Qt 4
Отправлено: Karl-Philipp от Май 15, 2007, 00:52
возможно я делаю что-то не так, но вот что у меня получается:

1. Создал директорию sql (D:\Qt projects\sql), в которой создал файл с кодом, приведенным мною выше.
2. Создал файл main.cpp и сохранил в директории sql.
3. С помощью MySQL создал базу, а в ней таблицу, затем скопировал их из директории c:\MySql\data\base\ директорию D:\Qt projects\sql.
4.создал файл проекта sqlproject c содержимым, описанным выше.
5. Выполнил следующие команды в консоли:

D:\Qt projects\sql>vsvars32
Setting environment for using Microsoft Visual Studio .NET tools.
(If you also have Visual C++ 6.0 installed and wish to use its tools
from the command line, run vcvars32.bat for Visual C++ 6.0.)

D:\Qt projects\sql>qmake -tp vc -o sqlproject.vcpro sqlproject.pro
D:\Qt projects\sql>

перешёл в VS, загружаю файл проекта sqlproject.vcpro, нажимаю F7, получаю логи:
------ Build started: Project: sqlproject, Configuration: Debug Win32 ------

Compiling...
main.cpp
Linking...

Build log was saved at "file://d:\Qt projects\sql\debug\BuildLog.htm"
sqlproject - 0 error(s), 0 warning(s)

---------------------- Done ----------------------
    Build: 1 succeeded, 0 failed, 0 skipped

6. Создал каталог sqldrivers в каталоге debug (D:\Qt projects\sql\debug, в котором появился ехе-шник).
Скопировал в каталог sqldrivers библиотеку qsqlmysql.dll, скомпилированную предварительно (см. сообщение выше).
7. Скопировал в каталог с ехе-шником (в debug) файл C:\mysql\lib\opt\libmySQL.dll

8. Запускаю ехе-шник и появляестя окошко "Database Error" с сообщением driver not loaded driver not loaded

Может чего начудил с каталогами? Или с самим проектом?


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 15, 2007, 08:58
Попробуй сделай подкаталог типа bin, положи туда ехе и libmySQL.dll, в нем создай sqldrivers и туда qsqlmysql.dll.
И проследи, чтобы все собиралось либо чисто в релизе, либо чисто в дебуге. Потому что смотри - у тебя ехе по идее в дебаге собрано, а C:\mysql\lib\opt\libmySQL.dll - это релизная либа. Да и qsqlmysql.dll у тебя тоже сделана в релизе (дебажная будет еще d на конце иметь).
Попробуй примеры покомпились и позапускать, должно работать...


Название: Драйвер базы данных в Qt 4
Отправлено: Karl-Philipp от Май 15, 2007, 11:10
похоже я понял в чём проблема: вместо файла libmySQL.dll из директории C:\mysql\lib\opt\ использовал файл libmySQL.lib
Прошу прощения за невнимательность.
В директории C:\mysql\lib\opt\ был только файл libmySQL.lib, а как из него можно получить libmySQL.dll?


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 15, 2007, 11:23
У меня и dll тоже там.
А еще в C:\mysql\bin\ копия лежит.


Название: Драйвер базы данных в Qt 4
Отправлено: Karl-Philipp от Май 15, 2007, 20:16
Racheengel,
спасибо большое за терпение и исчерпывающие ответы.
Мне удалось найти ошибку в файле имя_проекта.pro:

CONFIG += qt
QT += sql
SOURSES += main.cpp

я сделал ошибку, написав слово SOURSES вместо SOURСES

век живи, век учись...


Название: Драйвер базы данных в Qt 4
Отправлено: Racheengel от Май 15, 2007, 23:16
рад был помочь, хорошо что все ок.