LinuxForum.Fans
Тема

QtSDK Oracle OCI driver

Автор: tmp13 16 сообщений 5756 просмотров
#182501

Вообщем заморочался я на QT+C++
Сам QTSDK скачивал с сайта Nokia.
После тяжелого мозго..выноса. собрал OCI драйвер для Oracle.
Вообщем в результате имеем:

libqsqloci.so

Положил я этот файлик в

/home/peter/Documents/Program/QtSDK/QtCreator/lib/qtcreator/plugins/sqldrivers

Написал прогу типа:

text
    QSqlDatabase db;
    db.addDatabase("QOCI");
    db.setDatabaseName("TEST");
    db.setUserName("ovd_test_user");
    db.setPassword("alalal");
    bool ok = db.open();

Запускаем и...

QSqlDatabase: QOCI driver not loaded
QSqlDatabase: available drivers: QSQLITE

Вопрос каким макаром догрузить драйвер из уже готового so файла?

Ну и вообще от куда он знает где какой драйвер лежит и надо ли его подгружать?

#182502

Нашёл такую штуку
http://developer.qt.nokia.com/faq/answer/loading_a_sql_driver_from_a_customized_location

Не помогло(

+
Помучал ldconfig ещё результат:
[console]ldconfig -p|grep oci
libqsqloci.so (libc6) => /usr/lib/oracle/10.2.0.3/client/lib/libqsqloci.so[/console]

И всё равно:
QSqlDatabase: QOCI driver not loaded
QSqlDatabase: available drivers: QSQLITE

мб перегрузится надо?))
(щас правда возможности нет)

#182509

нафига sdk с нокии качали? можно же всё пакетами поставить...
собственно как я понял вся sdk лежит в /home/peter/Documents/Program/QtSDK/
так чего программа слинкована с /usr/lib/oracle/10.2.0.3/client/lib/libqsqloci.so.
да... и все директории с либами из самопальной sdk при запуске и при сборке в LDPATH прописаны?

#182698

/usr/lib/oracle/10.2.0.3/client/lib/libqsqloci.so
я ещё и сюда положил.

нафига sdk с нокии качали? можно же всё пакетами поставить...

openSuse 11.2 на работе... нету репозиториев вроде.

и все директории с либами из самопальной sdk при запуске и при сборке в LDPATH прописаны?

не очень понял что за самопальная sdk?

#184043

В продолжение темы!...
Установил всё через rpm!
Поставил такой замечательный пакет как
[console]libqt4-sql-unixODBC-4.7.1-7.2.x86_64[/console]
появился ODBC драйвер только вот пишут что для Oracle он не подойдёт...

Ладно поставил с оф сайт oracle
[console]oracle-instantclient-odbc-10.2.0.4-1.x86_64[/console]
есть там

/usr/lib/oracle/10.2.0.4/client64/lib/libsqora.so.10.1

такая библиотека.. вопрос как её прикрутить к qt-creator??

#184052
tmp13 написал:
появился ODBC драйвер только вот пишут что для Oracle он не подойдёт...

казалось бы при чём тут вообще оракл...

tmp13 написал:
Ладно поставил с оф сайт oracle

что за библиотека не понятно... ссылку на исходники для неё прилепили бы что ли...
для оракла вроде нужен oci драйвер...

#184265

Задача приконектится к ДБ Oracle=)
Вот вообщем то и всё=)
Через Java делается 3 строчками... тут просто невероятные усилия надо сделать.. и в инте почти 0 инфы на эту тему=)

что за библиотека не понятно... ссылку на исходники для неё прилепили бы что ли..

http://www.oracle.com/technetwork/database/features/instant-client/linuxx86-64soft-092277.html
oracle-instantclient-odbc-10.2.0.4-1.x86_64.rpm

#184274

наконец вроде понял, что вы хотите... чтобы добавить поддержку библиотеки в pro-файл добавьте:

text
INCLUDE+=<путь к хедерам из sdk>
LIBS+=-L/usr/lib/oracle/10.2.0.4/client64/lib/ -lsqora.so.10.1

ну или какие-то ещё библиотеки...

но по идее правильно будет собрать драйвер, как вы и раньше делали, но с версией qt из пакетов дистрибутива...

tmp13 написал:
Через Java делается 3 строчками...

неужели это потому что и тем и тем занимается оракл smile

tmp13 написал:
тут просто невероятные усилия надо сделать.. и в инте почти 0 инфы на эту тему=)

видимо этим мало-кто занимается...

#184658

Вообщем попробывал есть 2 проблемы
1. Поставил sdk пакет oracle
[console]# rpm -ql oracle-instantclient-devel-10.2.0.4-1.x86_64
/usr/include/oracle/10.2.0.4/client64/nzerror.h
/usr/include/oracle/10.2.0.4/client64/nzt.h
/usr/include/oracle/10.2.0.4/client64/occi.h
/usr/include/oracle/10.2.0.4/client64/occiAQ.h
/usr/include/oracle/10.2.0.4/client64/occiCommon.h
/usr/include/oracle/10.2.0.4/client64/occiControl.h
/usr/include/oracle/10.2.0.4/client64/occiData.h
/usr/include/oracle/10.2.0.4/client64/occiObjects.h
/usr/include/oracle/10.2.0.4/client64/oci.h
/usr/include/oracle/10.2.0.4/client64/oci1.h
/usr/include/oracle/10.2.0.4/client64/oci8dp.h
/usr/include/oracle/10.2.0.4/client64/ociap.h
/usr/include/oracle/10.2.0.4/client64/ociapr.h
/usr/include/oracle/10.2.0.4/client64/ocidef.h
/usr/include/oracle/10.2.0.4/client64/ocidem.h
/usr/include/oracle/10.2.0.4/client64/ocidfn.h
/usr/include/oracle/10.2.0.4/client64/ociextp.h
/usr/include/oracle/10.2.0.4/client64/ocikpr.h
/usr/include/oracle/10.2.0.4/client64/ocixmldb.h
/usr/include/oracle/10.2.0.4/client64/odci.h
/usr/include/oracle/10.2.0.4/client64/oratypes.h
/usr/include/oracle/10.2.0.4/client64/ori.h
/usr/include/oracle/10.2.0.4/client64/orid.h
/usr/include/oracle/10.2.0.4/client64/orl.h
/usr/include/oracle/10.2.0.4/client64/oro.h
/usr/include/oracle/10.2.0.4/client64/ort.h
/usr/include/oracle/10.2.0.4/client64/xa.h
/usr/lib/oracle/10.2.0.4/client64/lib/libclntsh.so
/usr/lib/oracle/10.2.0.4/client64/lib/libocci.so
/usr/share/oracle/10.2.0.4/client64/cdemo81.c
/usr/share/oracle/10.2.0.4/client64/demo.mk
/usr/share/oracle/10.2.0.4/client64/occidemo.sql
/usr/share/oracle/10.2.0.4/client64/occidemod.sql
/usr/share/oracle/10.2.0.4/client64/occidml.cpp[/console]

2. Добавил в pro file:

INCLUDEPATH += /usr/include/oracle/10.2.0.4/client64/
LIBS+=-L/usr/lib/oracle/10.2.0.4/client64/lib/ -lsqora.so.10.1

пробывал и просто INCLUDE(INCLUDEPATH он выделяет)

3. Код:

text
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setUserName("test_user");
    db.setPassword("test");
    db.setDatabaseName("(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.16.220)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = test)))");
    db.open();
    if (!db.open()) {
            QMessageBox::critical(0, qApp->tr("Cannot open database"),
                    qApp->tr("Unable to establish a database connection."), QMessageBox::Cancel);
    }

4. Запуск:
а) Если пишем:

INCLUDE += /usr/include/oracle/10.2.0.4/client64/
LIBS+=-L/usr/lib/oracle/10.2.0.4/client64/lib/ -lsqora.so.10.1

Запускается но говорит что приконектится не может

б) Если пишем:

INCLUDEPATH += /usr/include/oracle/10.2.0.4/client64/
LIBS+=-L/usr/lib/oracle/10.2.0.4/client64/lib/ -lsqora.so.10.1

Cannot find -lsqora.so.10.1
Файл не найден

После перезапуска в варинте и А и Б выдет

Cannot find -lsqora.so.10.1
Файл не найден

Собствено если он его найдёт должен появится выбор ещё одного DatabaseDriver типа QORACLEODBC?

5. Где взять иходники для QtCreator 4.7.1?
поставил libqt4-devel
в ней в упор нету папки

sqldrivers/oci

6. b.setDatabaseName("(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.16.220)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = test)))");

Где то нашёл что так у кого то работает но:
мб там просто надо указывать SID базы TEST?
знает ли QtCreator что у меня прописана TNS_ADMIN в профайле где уже есть строка

(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.16.220)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = test)))

Но в любом случае не работает ни как=)


--------------------------------------------------------------------------
Попробывал сделать #include <occi.h>
нашёл даже такую тему:
http://forums.oracle.com/forums/thread.jspa?threadID=2259933&tstart=0

получаю ошибку как в теме.. что делать не понятно)

сделал даже

INCLUDEPATH += /usr/include/oracle/10.2.0.4/client64/
INCLUDEPATH += /usr/lib/oracle/10.2.0.4/client64/lib/
=(

#184676

Получилось блин!!!
только всё равно ни хрена не понятно что терь под каждую версию qt заставлять всех собирать свою oracle oci библиотеку что ли(

#184884
tmp13 написал:
только всё равно ни хрена не понятно что терь под каждую версию qt заставлять всех собирать свою oracle oci

может плагин от старых версий кьюта должен работать с новыми? но это нужно пробовать... возможно даже наоборот...
ИМХО большей проблемой будет то, что для работы нужны оракловские либы... почитайте о том, православно ли их распространять самому...

#184926

Думаю Oracle Client все сами должны будут скачивать=)
А вообще прогу чисто эгоистично пишу для себя... ибо хороший админ ленивый админ)

Если что выложу куда нить)

#209125

Для сумашедших типа меня.... Напишу сумбурно ибо делал давно и забил на эту идею...
1. Скачиваем Oracle Client c oracle.com
http://www.oracle.com/technetwork/database/features/instant-client/linuxx86-64soft-092277.html
я скачал 10.2.0.4
пакеты:
oracle-instantclient-sqlplus-10.2.0.4-1.x86_64
oracle-instantclient-basic-10.2.0.4-1.x86_64
oracle-instantclient-devel-10.2.0.4-1.x86_64
oracle-instantclient-odbc-10.2.0.4-1.x86_64

соответственно rpm -Uhv ставим всё это дело.

2. Ставим qt-creator из репозитория ДИСТРИБУТИВА ибо НЕ из дистрибутива работать НЕ будет!!(чОрт знает почему не помню уже, а мб у кого то уже и будет)
в данный момент у меня openSuse 11.4 x86_64
Установлен

Qt Creator 2.1.0
Основан на Qt 4.7.1 (64-х битной)

3. Скачиваем с Nokia QtSDK
http://qt.nokia.com/downloads/
*WALL*
http://qt.nokia.com/downloads/sdk-linux-x11-64bit-cpp-offline
Я скачал Nokia QTSDK 4.7.4
Поставил в /home/peter/Documents/Program/QtSDK
(Мб можно не страдать всей этой фигнёй с просто скачать это:
http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.1.tar.gz тут 4.7.1 дабы соответствовать версии QTSDK из дистрибутива)

4. Тут начинается самый геморой могу допустить не точности
Надо собственно собарть oci драйвер к сожалению с помощью qt-sdk пакетов которые включены в репозиторий сделать это как я понял нереально... поэтому полюбому приходится скачивать QtSDK с сайта nokia.
Пунты 1) и 2) можно не выполнять если в пунке 3 были скачены сразу сырцы.
1) ~/Documents/Program/QtSDK> ./SDKMaintenanceTool
2) Устанавливаем QtSDK Source т.к у нас с дистрибутивом идёт QT 4.7.1 его сырцы и ставим.

3) Собираем треклятый драйвер
[console]cd /home/peter/Documents/Program/QtSDK/QtSources/4.7.1/src/plugins/sqldrivers/oci[/console]
[console]qmake -o Makefile "INCLUDEPATH+=/usr/lib/oracle/10.2.0.4/client64" "LIBS+=-L/usr/lib/oracle/10.2.0.4/client64/lib" oci.pro[/console]
4) Тут я ваще ни хрена не помню...:
Получаем Makefile
делаем
[console]make[/console]
наверное надо сделать
[console]make install
ldconfig[/console]
трулялял у нас есть
libqsqloci.so
Я этот файл закинул себе в проект на фига я хз=) Так же почему то валялось у меня 2 команды:

[console]install -m 755 -p "libqsqloci.so" "/usr/lib/qt4/plugins/sqldrivers/libqsqloci.so"
strip --strip-unneeded "/usr/lib/qt4/plugins/sqldrivers/libqsqloci.so"[/console]
я не знаю на фига я их скопировал и не помню выполнял ли я их ваще, но если что то не заработает попробуйте и отпишите нужны ли эти команды=)

Возможные ошибки в Пункте 4 при сборке драйвера
1)make
[console]g++ -c -m64 -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/lib/oracle/10.2.0.4/client64 -I. -o main.o main.cpp
In file included from main.cpp:44:0:
../../../sql/drivers/oci/qsql_oci.h:47:46: fatal error: QtSql/private/qsqlcachedresult_p.h: Нет такого файла или каталога
compilation terminated.
make: *** [main.o] Ошибка 1
[/console]
Решение:
Добавить в MakeFile в строку INCPATH
-I/home/peter/Documents/Program/QtSDK/Simulator/Qt/gcc/included
Результирующая строка у меня выглядит так:
INCPATH = -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/lib/oracle/10.2.0.4/client64 -I. -I/home/peter/Documents/Program/QtSDK/Simulator/Qt/gcc/include


2)[console]g++ -c -m64 -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/lib/oracle/10.2.0.4/client64 -I. -I/home/peter/Documents/Program/QtSDK/Simulator/Qt/gcc/include -o qsql_oci.o ../../../sql/drivers/oci/qsql_oci.cpp
../../../sql/drivers/oci/qsql_oci.cpp:65:17: fatal error: oci.h: Нет такого файла или каталога
compilation terminated.
make: *** [qsql_oci.o] Ошибка 1[/console]

Решение
Добавить в MakeFile в строку INCPATH
-I/usr/include/oracle/10.2.0.4/client64
Результирующая строка у меня выглядит так:
INCPATH = -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/lib/oracle/10.2.0.4/client64 -I. -I/home/peter/Documents/Program/QtSDK/Simulator/Qt/gcc/include -I/usr/include/oracle/10.2.0.4/client64


Обращайте внимение на пути в библиотекам или файлам. Действовал тупо копи пастом=)

P.S Особую благадарность хотелось бы выразить человеку написавшему следующий пост:
http://www.forum.crossplatform.ru/index.php?showtopic=3840&view=findpost&p=27143

#209294

tmp13, а в вики это не запостишь, а то выглядит болей-менее солидно(не считая вставок вроде "тут я не помну"), а тут это затеряется?

#209391

Если та wiki которая сверху "Документация WIKI" там при открытии

500 Internal Server Error

и вообще я не разбираюсь как в wiki что-то постить... но можно попробывать.

#209406

мм... значит её с переезда так и не подняли... тогда тут уже ничего не поделаешь... только если ещё раз стукнуть в техподдержку...

Войдите или зарегистрируйтесь, чтобы ответить.