Russian Qt Forum

Qt => Базы данных => Тема начата: Astrologer от Сентябрь 30, 2010, 15:32



Название: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 15:32
Работал на SQlite  и понял что она мне не подходит. Прочитал форум но некоторые вещи мне непонятны.
1) Хочу собрать FireBird так чтобы можно было просто скопировать необходимые файлы (в папку с exe)  и работать с ним (в случае переноса на другую машину). Это называется статическая линковка?

http://www.prog.org.ru/topic_1983_0.html

Что такой статически скомпонованный драйвер? Один файл, при закидывании которого все работает? :)


Название: Re: Qt + fireBird
Отправлено: break от Сентябрь 30, 2010, 15:49
Это называется Embedded сервер - со стороны Qt тебе так и так просто надо собрать ibase драйвер. Ему все равно с полноценным или embedded сервером будешь работать.


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 16:01
В той теме он говорит. Изменить файл pri.

А вот мой файл .pri содержит несколько строк.     
Код:
win32 {
        !win32-borland : LIBS *= gds32_ms.lib
        win32-borland  : LIBS += gds32_bor.lib

Мой файл pri.
Код:
contains(sql-drivers, all ) {
    sql-driver +=   psql mysql odbc oci tds db2 sqlite ibase
}

contains(sql-drivers, psql) {
    HEADERS +=      drivers/psql/qsql_psql.h
    SOURCES +=      drivers/psql/qsql_psql.cpp

    unix {
        !isEmpty(QT_LFLAGS_PSQL) {
            LIBS *= $$QT_LFLAGS_PSQL
            QMAKE_CXXFLAGS *= $$QT_CFLAGS_PSQL
        }
        !contains(LIBS, .*pq.*):LIBS *= -lpq
    }

    win32 {
!win32-g++:!contains( LIBS, .*pq.* ):LIBS *= -llibpq
     win32-g++:!contains( LIBS, .*pq.* ):LIBS *= -lpq
        LIBS *= -lws2_32 -ladvapi32
    }
}

contains(sql-drivers, mysql) {
    HEADERS +=      drivers/mysql/qsql_mysql.h
    SOURCES +=      drivers/mysql/qsql_mysql.cpp

    unix {
        isEmpty(QT_LFLAGS_MYSQL) {
            !contains(LIBS, .*mysqlclient.*):!contains(LIBS, .*mysqld.*) {
                use_libmysqlclient_r:LIBS *= -lmysqlclient_r
                else:LIBS *= -lmysqlclient
            }
        } else {
            LIBS *= $$QT_LFLAGS_MYSQL
            QMAKE_CXXFLAGS *= $$QT_CFLAGS_MYSQL
        }
    }

    win32:!contains(LIBS, .*mysql.*):!contains(LIBS, .*mysqld.*) {
        !win32-g++:LIBS     *= -llibmysql    
win32-g++:LIBS    *= -lmysql
    }    
}

contains(sql-drivers, odbc) {
     HEADERS += drivers/odbc/qsql_odbc.h
     SOURCES += drivers/odbc/qsql_odbc.cpp

     mac:!contains( LIBS, .*odbc.* ):LIBS        *= -liodbc
     unix:!contains( LIBS, .*odbc.* ):LIBS       *= -lodbc

     win32 {
         !win32-borland:LIBS     *= -lodbc32
         win32-borland:LIBS      *= $(BCB)/lib/PSDK/odbc32.lib
     }
}

contains(sql-drivers, oci) {
    HEADERS += drivers/oci/qsql_oci.h
    SOURCES += drivers/oci/qsql_oci.cpp

    unix:!contains( LIBS, .*clnts.* ):LIBS += -lclntsh

    win32:LIBS += -loci
}

contains(sql-drivers, tds) {
    HEADERS += drivers/tds/qsql_tds.h
    SOURCES += drivers/tds/qsql_tds.cpp

    unix:LIBS += -L$SYBASE/lib -lsybdb

    win32 {
        !win32-borland:LIBS += -lNTWDBLIB
        win32-borland:LIBS += $(BCB)/lib/PSDK/NTWDBLIB.LIB
    }
}

contains(sql-drivers, db2) {
    HEADERS += drivers/db2/qsql_db2.h
    SOURCES += drivers/db2/qsql_db2.cpp
    
    unix:LIBS += -ldb2
    
    win32 {
        !win32-borland:LIBS += -ldb2cli
#        win32-borland:LIBS  += $(BCB)/lib/PSDK/db2cli.lib
    }
}

contains(sql-drivers, ibase) {
    HEADERS += drivers/ibase/qsql_ibase.h
    SOURCES += drivers/ibase/qsql_ibase.cpp
    
    unix:LIBS *= -lgds  
    
    win32 {
        !win32-borland:LIBS *= -lgds32_ms
        win32-borland:LIBS  += gds32.lib
    }
}

contains(sql-drivers, sqlite2) {
    HEADERS += drivers/sqlite2/qsql_sqlite2.h
    SOURCES += drivers/sqlite2/qsql_sqlite2.cpp
    !contains(LIBS, .*sqlite.*):LIBS *= -lsqlite
}

contains(sql-drivers, sqlite) {
    !system-sqlite:!contains( LIBS, .*sqlite3.* ) {
        CONFIG(release, debug|release):DEFINES *= NDEBUG
        DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE
        INCLUDEPATH +=  ../3rdparty/sqlite
        SOURCES +=      ../3rdparty/sqlite/sqlite3.c
    } else {
        LIBS *= $$QT_LFLAGS_SQLITE
        QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE
    }

    HEADERS +=      drivers/sqlite/qsql_sqlite.h
    SOURCES +=      drivers/sqlite/qsql_sqlite.cpp
}


Может проще собрать mySQL?


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 16:18
Код:
 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    if (!QFile::exists(dbFile)) return;
    db.setDatabaseName(dbFile);
        if (!db.open()) {
            QMessageBox::critical(0, qApp->tr("Cannot open database"),
                qApp->tr("Unable to establish a database connection.\n"
                         "This example needs SQLite support. Please read "
                         "the Qt SQL driver documentation for information how "
                         "to build it.\n\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);
        }

        _base_is_open = true;

Нормально проходит. Ничего не делал, только скопировал в корень экзешника папку "sqldrivers" и туда закинул "libmysql.dll".  В списке драйверов(QSqlDatabase::drivers()) - нету QMYSQL. Что то по моему тут неправильно.


Название: Re: Qt + fireBird
Отправлено: vipet от Сентябрь 30, 2010, 16:28
Работал на SQlite  и понял что она мне не подходит. Прочитал форум но некоторые вещи мне непонятны.
1) Хочу собрать FireBird так чтобы можно было просто скопировать необходимые файлы (в папку с exe)  и работать с ним (в случае переноса на другую машину). Это называется статическая линковка?

http://www.prog.org.ru/topic_1983_0.html

Что такой статически скомпонованный драйвер? Один файл, при закидывании которого все работает? :)

Для того, чтобы просто все скопировать в папку с .exe-шником твоей проги, не нужно собирать файрбёрд. Скачиваешь .zip c Firebird Embedded и раcпаковываешь архив в ту папку. Всё.

Статическая линковка - это если хочешь, чтобы кроме твоего exe-шника больше никаких dll-ек не нужно было. Но тогда и MS CRT надо статически линковать (есть статься на wiki про это).

Потом сам Firebird Embedded, если мне не изменяет память слинкован с MS CRT от 2005 студии, т.е. в этом случае его нужно видимо пересобрать.

Короче, если без гемора, то скопируй fbembed.dll и другие dll-ки и файлы из его архива в папку с .exe-шником и не парься.


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 16:54
И как же указать QSqlDatabase что надо именно firebird загружать?


Название: Re: Qt + fireBird
Отправлено: Jo от Сентябрь 30, 2010, 17:10
1. Скопировать fbclient_ms.lib из D:\Firebird\Firebird_2_1\lib и переименовал в fbclient.lib в папку проекта D:\Qt\4.6.0\src\plugins\sqldrivers\ibase\

2. Затем открыть проект (я использовал QtCreator) D:\Qt\4.6.0\src\plugins\sqldrivers\ibase\ibase.pro

3. В конфигурации пректа в разделе этапы сборки в дополнительных параметрах указал такую строчку: -o Makefile INCLUDEPATH+=D:\Firebird\Firebird_2_1\include LIBS+=-lfbclient

4. Собрать в режиме дебаг и релиз

В результате вышеописанных действий в папке D:\Qt\4.6.0\plugins\sqldrivers появились нужные файлы qsqlibase4.* и qsqlibased4.*

собственно драйвер есть...

Дальше при использовании embedded  версии fb необходимо переименовать файл fbembed.dll в fbclient.dll и положить в папку с .exe файлом. (ну и в папку с проектом тоже можешь запулить)

QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE");
и погнал.


P.S. Пути естественно исправь на свои. Должно получиться. Удачи!


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 20:06
Спасибо тебе большое! Все очень подробно.
Дошел до открытия проекта.
Код:
C:/Qt/2010.02.1/qt/src/plugins/sqldrivers/ibase/../../../sql/drivers/ibase/qsql_ibase.h:48: error: ibase.h: No such file or directory

Ругается.

Код:
C:/Qt/2010.02.1/qt/src/sql/drivers/ibase/qsql_ibase.h:87: error: expected ')' before 'connection'

на строку в файле qsql_ibase.h
Код:
explicit QIBaseDriver(isc_db_handle connection, QObject *parent = 0);


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 20:50
не хватает заголовочных файлов firebird


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 20:56
В Qt Creator вписал такую строчку (по кнопке "Подробнее" в строку "Параметры Make"):

-o Makefile INCLUDEPATH+=C:\Firebird\Firebird_2_1\include LIBS+=-lfbclient

Он не шерстит по директории include, там ведь и лежат хидеры?


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 20:58
ну вам же должно быть виднее лежат они там или нет.... посмотрите...


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 20:59
А вообще взял я из папки firebird все дллки из папки bin и кинул в корень exe  и в папку /sqldrivers.

Код:
 QSqlDatabase dbs = QSqlDatabase::addDatabase("QIBASE");
    dbs.setDatabaseName("myBase.db");
    bool _is_open = dbs.open();
    QStringList drList = dbs.drivers();

_is_open = false;
drList не содержит QIBASE.


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 21:02
и на кой черт вы их туда кинули... ?? в папке sqldrivers есть sqlibase4.* и qsqlibased4.* ??


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 21:04
Та папка лежит в корневой моего exe.


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 21:07
ну вам же должно быть виднее лежат они там или нет.... посмотрите...

Лежат. Но ведь все равно ругается.


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 21:12
каким компилятором пользуетесь??


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 21:20
MiniGW.

Crossly, А просто взять dll как сказано было выше и прикрутить их не получится?


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 21:41
открываем консоль.... и пишем....
Код:
cd %QTDIR%\src\plugins\sqldrivers\ibase
qmake "INCLUDEPATH+=C:\Firebird\Firebird_2_1\include" "LIBS+=C:\Firebird\Firebird_2_1\lib\fbclient.lib" ibase.pro
mingw32-make

а что вы собственно собираетесь прикрутить... dll для начала собрать надо...


Название: Re: Qt + fireBird
Отправлено: Astrologer от Сентябрь 30, 2010, 22:05
Собрал. Появились файлы в директории c:\Qt\2010.02.1\qt\plugins\sqldrivers\

беру всю папку и копирую в папку debug с моим проектом. Запускаю.
Код:
QSqlDatabase dbs = QSqlDatabase::addDatabase("QIBASE");
    dbs.setDatabaseName("myBase.db");
    bool _is_open = dbs.open();
    QStringList drList = dbs.drivers();

В drList есть "QIBASE". Однако _is_open = false. Я хочу чтобы база сохранялась в файл. Я так делал с sqlite. Но она вроде же заточена под это. А тут что нужно сделать чтобы похожим образом работала на локальной машине?


Название: Re: Qt + fireBird
Отправлено: crossly от Сентябрь 30, 2010, 22:18
скачать firebird embedded и положить в папку с exe (переименовав fbembed.dll в fbclient.dll).... и не забыть создать базу...


Название: Re: Qt + fireBird
Отправлено: Astrologer от Октябрь 01, 2010, 11:06
При использовании sqlite база создавалась когда я открывал QsqDatabase. Здесь так не получается(

Скачал embedded с

http://sourceforge.net/projects/firebird/files/firebird-win32/2.1.3-Release/Firebird-2.1.3.18185-0_Win32_embed.zip/download


Название: Re: Qt + fireBird
Отправлено: Jo от Октябрь 01, 2010, 11:37
Не дружище, тебе надо скачать IDE для создания баз.

поищи тут http://ibase.ru/download.htm

дык ты драйвер поставил?


Название: Re: Qt + fireBird
Отправлено: Astrologer от Октябрь 01, 2010, 11:50
Jo Да, драйвер поставил. Теперь мне надо создать файл в котором будет лежать база. Вроде разница только в драйвере, в SQlite все работало. Допустим надо создать файл "myBase.dbs".
Код:
QSqlDatabase dbs = QSqlDatabase::addDatabase("QIBASE");
dbs.setDatabaseName("myBase.dbs");
QStringList dbList = QSqlDatabase::drivers();
bool _is_open= dbs.open();
в dbList есть "QIBASE". Проблема то не в драйвере уже, как я понимаю. В папке debug лежат dll из архива по ссылке выше. И bclient.dll тоже есть и тоже в папке.


Название: Re: Qt + fireBird
Отправлено: Hellraiser от Октябрь 01, 2010, 12:01
Только SQLite позволяет указывать при подключении имя несуществующего файла (он его просто создаст - т.е. будет пустая база без таблиц). Все остальные СУБД требуют существующую базу / файл. Поэтому Jo правильно предлагает найти программу для создания базы (хотя можно и консольными утилитами из комплекта).


Название: Re: Qt + fireBird
Отправлено: crossly от Октябрь 01, 2010, 13:11
в составе embedded есть утилита isql .... запускаем...
Код:
create database 'имя файла' user 'sysdba';
...
а вообще надо взять документацию по firebird... там все написано...


Название: Re: Qt + fireBird
Отправлено: sne от Октябрь 01, 2010, 14:52
На счет встроеного fb яхз, на полноценной версии СУБД, чуть поменял в нужную мне сторону qtfirebirdibppsqldriver. Возможно поможет.


Название: Re: Qt + fireBird
Отправлено: Astrologer от Октябрь 01, 2010, 15:15
Я скачал IBExpert. Создал базу, подключился, все работает. Огромное спасибо за терпение и помощь, оcобенно Jo, Crossly, Hellraiser, SNE, Break, Vipet.  :)