Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 11, 2007, 00:51
Приветствую всех. Есть две проблемки, и очень прошу помочь. Проблема первая : Есть линукс, на нём установлена Qt 3.3.6., есть ноутбук с виндой, они объеденены в сеть. На ноуте установлен Oracle 10g XE. Для того чтобы собрать драйвер QOCI8, взял исходники и библиотеки из дистрибутива Oracle 10g XE, всё собралось на ура, дизайнер драйвер видит, а при запуске программы выдаёт следующее : Failed to open database: QOCI: Unable to logon ORA-12154: TNS:could not resolve the connect identifier specified
причём такое ощущение что он даже не пытается соединиться с ноутом(на нем пакеты не принимаются(фаервола нет)). Проблема вторая : Устанавливаю на ноут под виндой QT 3.3.6, использую как компилятор Borland C++ Builder 6, все делаю так же как и в лине, прописываю путь к инклудам оракла, к либам. делаю implib oci.lib oci.dll. начинаю собирать. получаю следующее : MAKE Version 5.2 Copyright (c) 1987, 2000 Borland cd oci make -f Makefile MAKE Version 5.2 Copyright (c) 1987, 2000 Borland ilink32 @MAKE0000.@@@ Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland Error: Unresolved external '_OCILogoff' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIHandleFree' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCITransStart' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIErrorGet' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCITransCommit' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCITransRollback' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIAttrGet' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIParamGet' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCILogon' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIServerVersion' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIDescriptorFree' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIHandleAlloc' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtPrepare' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIBindByName' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIBindByPos' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIAttrSet' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIDescriptorAlloc' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIDefineByPos' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtExecute' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtFetch2' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtGetPieceInfo' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtSetPieceInfo' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIStmtFetch' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCILobGetLength' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCILobCharSetForm' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCILobRead' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ Error: Unresolved external '_OCIEnvCreate' referenced from C:\QT\3.3.6\PLUGINS\SRC\SQLDRIVERS\OCI\OBJ\QSQL_OCI.OBJ ** error 2 ** deleting ..\..\..\sqldrivers\qsqloci.dll ** error 1 ** deleting sub-oci ** error 1 ** deleting sub-sqldrivers ** error 1 ** deleting sub-plugins The build process failed!
помогите плиз, срочно нада, диплом горит :)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: Tonal от Февраль 11, 2007, 11:01
Посмотри какие имена экспортирует oci.dll с помощью tdump.
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 11, 2007, 12:35
вроде всё норм, а файлы на форуме прикреплять нельзя ? 000029E0 390 0185 OCILogoff 00002724 320 013F OCIHandleFree и т.д.
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: Tonal от Февраль 11, 2007, 13:31
Смотри, в сообщении линкера имя с подчерком,: Error: Unresolved external '_OCILogoff' А в импорте - OCILogoff, без. Похоже не соответствует соглашения о вызовах...
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 11, 2007, 13:33
и что делать ?
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: Tonal от Февраль 11, 2007, 14:18
Читать доку к клиенту оракла - вполне возможно нужно какой-нибудбдефайн для борланда указать... Ну и гугль, на этот предмет...
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: nova от Февраль 11, 2007, 20:05
Ранше у оракла в клиенте было две библиотеки, одна для линковки борландом, другая для студии. А на счет линуха проверь установки орасле_хоме, налисие там в правильном месте tnsnames.ora, или пропиши TNS_ADMIN="полный путь к tnsnames.ora". А шоб не думатьшо выдерать из оракла чтоб твоя программа работала пользуй оракловский instantclient.
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 12, 2007, 01:14
Ранше у оракла в клиенте было две библиотеки, одна для линковки борландом, другая для студии. А на счет линуха проверь установки орасле_хоме, налисие там в правильном месте tnsnames.ora, или пропиши TNS_ADMIN="полный путь к tnsnames.ora". А шоб не думатьшо выдерать из оракла чтоб твоя программа работала пользуй оракловский instantclient. вообщем все сделал, не конектится. под виндой через sqlplus все норм, а вот прога не хоттит конектится :( Хелп. добавлено спустя 1 час 31 минуту: уффф, второй вопрос снят. сделал : implib -a oci.lib oci.dll правда oci.dll из 10g не доконца преобразовалась. А вот из 9i на ура. Остался только первый вопрос :)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: Admin от Февраль 12, 2007, 09:48
копай папку типа network/admin в Oracle на предмет tnsnames.ora и самое первое заставь на клиентской машине конектится через Oracle Клиент типа Enterprise Manager
еще проверь установку переменных типа ORACLE_HOME ORACLE_SID
PS: не часто в оракле приходится работать
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: nova от Февраль 12, 2007, 20:37
Если я тебя правильно понял, то оракловский плугин у тебя грузится, а при попытке коннекта выскакивает ошибка и енто все под линухом. В этом случае для коннекта достаточно прописать например: export TNS_ADMIN=/etc/oracle и в этот каталог положить файл tnsnames.ora с веников В коде при коннекте устанавливаеш userName,password и dbname. причем dbnamе должен быть такой как прописан в tnsnames.ora если в tnsnames.ora прописано SALES = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.8.254)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sales) ) ) aaaaa = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.8.254)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sales) ) )
то в дбнаме можно прописать как "sales" так и "aaaaa" в данном примере это ссылки на одну базу :)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 13, 2007, 19:03
спасибо, помогло, прога терь запускается норм. А вод дизайнер при настройке дататабле выводит эту ошибку. бум думать.
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: nova от Февраль 13, 2007, 19:55
Ну дык, дизайнер не видит TNS_ADMIN. И думать нечего :)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 13, 2007, 19:56
и не увидит ?:)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: nova от Февраль 13, 2007, 19:57
Почему?
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Февраль 19, 2007, 22:14
Народ, терь такая проблема : В винде, на машине где оракл, в дизайнере кидаю на форму QDataTable, настраиваю соединение, все норм проходит, таблицы вижу, данные выводятся. Собираю прогу, запускаю пишет : An eerror occurred while accessing the database в логах listener.log : TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production on 19-ФЕВ-2007 15:18:54
Copyright (c) 1991, 2005, Oracle. All rights reserved.
System parameter file is C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\listener.ora Log messages written to C:\oraclexe\app\oracle\product\10.2.0\server\network\log\listener.log Trace information written to C:\oraclexe\app\oracle\product\10.2.0\server\network\trace\listener.trc Trace level is currently 0
Started with pid=1412 Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR_XEipc))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.211.219)(PORT=1521))) Listener completed notification to CRS on start
TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [* SID] * RETURN CODE Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8080))(Presentation=HTTP)(Session=RAW)) 19-ФЕВ-2007 15:19:48 * service_register * xe * 0 19-ФЕВ-2007 15:20:00 * service_update * xe * 0 19-ФЕВ-2007 15:20:18 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)(CID=(PROGRAM=C:\test\test.exe)(HOST=NOTEBOOK)(USER=Tuki-Tuki))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.211.219)(PORT=1393)) * establish * XE * 0 19-ФЕВ-2007 15:20:18 * service_update * xe * 0 19-ФЕВ-2007 15:20:21 * service_update * xe * 0 19-ФЕВ-2007 15:20:33 * service_update * xe * 0 19-ФЕВ-2007 15:21:06 * service_update * xe * 0 19-ФЕВ-2007 15:21:40 * service_update * xe * 0
Коннект к базе : #include <qapplication.h> #include <qsqldatabase.h> #include <qsqlquery.h> #include <iostream.h> #include "form1.h" #define DB_ORDERS_DRIVER "QOCI8" #define DB_ORDERS_DBNAME "XE" #define DB_ORDERS_USER "ASONIKA_CH" #define DB_ORDERS_PASSWD "NADEGNOST" #define DB_ORDERS_HOST "192.168.211.219"
bool createConnections() { QSqlDatabase *oracle = QSqlDatabase::addDatabase( DB_ORDERS_DRIVER, "ORACLE" ); oracle->setDatabaseName( DB_ORDERS_DBNAME ); oracle->setUserName( DB_ORDERS_USER ); oracle->setPassword( DB_ORDERS_PASSWD ); oracle->setHostName( DB_ORDERS_HOST ); if ( ! oracle->open() ) { qWarning( "Failed to open orders database: " + oracle->lastError().text() ); return FALSE; } return TRUE; } int main( int argc, char ** argv ) { QApplication a( argc, argv ); Form1 w; createConnections(); w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec(); }
listener.ora : SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = XE) (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = XE) (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server) (PROGRAM = extproc) ) )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.211.219)(PORT = 1521)) ) ) DEFAULT_SERVICE_LISTENER = (XE)
tnsnames.ora XE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.211.219)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) )
EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )
ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) )
В чём проблема ? добавлено спустя 5 часов 53 минуты: вот ещё логи : 19-ФЕВ-2007 21:27:56 * service_register * xe * 0 19-ФЕВ-2007 21:28:07 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)(CID=(PROGRAM=C:\test\test.exe)(HOST=NOTEBOOK)(USER=Tuki-Tuki))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.10.0.2)(PORT=1138)) * establish * XE * 0 19-ФЕВ-2007 21:28:08 * service_update * xe * 0 19-ФЕВ-2007 21:28:14 * service_update * xe * 0 19-ФЕВ-2007 21:28:31 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)(CID=(PROGRAM=C:\test\test.exe)(HOST=NOTEBOOK)(USER=Tuki-Tuki))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.10.0.2)(PORT=1139)) * establish * XE * 0 19-ФЕВ-2007 21:28:32 * service_update * xe * 0 19-ФЕВ-2007 21:28:35 * service_update * xe * 0 19-ФЕВ-2007 21:28:38 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)(CID=(PROGRAM=C:\test\test.exe)(HOST=NOTEBOOK)(USER=Tuki-Tuki))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.10.0.2)(PORT=1140)) * establish * XE * 0 19-ФЕВ-2007 21:28:38 * service_update * xe * 0 19-ФЕВ-2007 21:28:41 * service_update * xe * 0 19-ФЕВ-2007 21:28:43 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)(CID=(PROGRAM=C:\test\test.exe)(HOST=NOTEBOOK)(USER=Tuki-Tuki))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.10.0.2)(PORT=1141)) * establish * XE * 0 19-ФЕВ-2007 21:28:44 * service_update * xe * 0 19-ФЕВ-2007 21:28:47 * service_update * xe * 0
как я понимаю listener видит что прога коннектится, так почему же соединение не устанавливается? добавлено спустя: ой, извините, тупил. всё, терь пока всё работает :)
Название: Qt 3.3.6 + Oracle 10g XE
Отправлено: TukiNov от Март 09, 2007, 13:14
Появилась новая проблема, ничего по ней не нашёл даже в гугле. Простые поля селектятся нормально, а вот что происходит с RAW полями : QOCI9Result::cacheNext: ORA-01010: invalid OCI operation
делал и через QSqlQuery, и через QSqlCursor, толку нет. Через QSqlQuery делаю стандартно : QSqlQuery query; query.exec("SELECT MCNST FROM FORMSFE WHERE FORMINTOT='128' and classnum='33' and VERSION='1'"); cout << query.numRowsAffected() << endl; while(query.next()){ cout << query.value(0).toString() << endl; }
Может кто нить подскажет что делать. Горю ... :(
|