Russian Qt Forum
Ноябрь 23, 2017, 18:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ПРОБЛЕМА!!! с Qt 4 + Oracle 10g ПОМОГИТЕ!!!  (Прочитано 13116 раз)
AlexVK
Гость
« : Май 16, 2007, 11:25 »

Люди только не пинайте по лицу ногами! Знаю что вопрос обсуждался сотни раз. Но никак не получается у меня подключиться к базе Oracle 10g! Использую коммерческую Qt 4.2.0 (проинтегрированная в VS 2005), ну соответственно Windows XP, поставил клиента Oracle 10g (XEClient, c:\XEClient).
1) Создал папку в c:\XEClient, network\admin туда поместил файл tnsnames.ora, со следующим содержимым:
   
Код:
db_name=
        (DESCRIPTION =
               (ADDRESS_LIST =
                 (ADDRESS = (PROTOCOL = TCP)(HOST = ip_adres)(PORT = 1521)))
              (CONNECT_DATA =(SERVER = DEDICATED)(SID = db_name)))


2) Собрал драйвер для Oracle:
   2.1. В командной строке VS 2005 command Prompt, прописал следующее:
      set INCLUDE=%INCLUDE%;c:\XEClient\oci\include
      set LIB=%LIB%;c:\XEClient\oci\lib\msvc
      cd %QTDIR%\src\plugins\sqldrivers\oci
      qmake -o Makefile oci.pro
      nmake
  В папке C:\Qt\4.2.0\plugins\sqldrivers, появились файлы: qsqloci.dll, qsqloci.dll.manifest, qsqloci.lib.

3) Создал проект Qt application.
  3.1. Создал файл для подключения connection.h.
     
Код:
#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

static bool createConnection()
{
                QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setUserName("user_name");
db.setPassword("password");
db.setHostName("ip");
db.setPort(1521);
db.setDatabaseName("db_name");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This example needs OCI support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}
return true;
}
#endif
   

3.2. Создал файл testdb.pro
       
Код:
TARGET = DB

       HEADERS = testdb.h connection.h
       SOURCES = main.cpp testdb.cpp

      FORMS = db.ui

    build_all:!build_pass {
        CONFIG -= build_all
        CONFIG += debug_and_release
    }

    3.3. в папку  c:\Windows\system32, положил oci.dll из клиента
    3.4. откомпилировал
    в VS 2005 prompt набрал set PATH=%PATH%;c:\XEClient\bin
    затем qmake -o Makefile testdb.pro
    затем nmake

Проверял на SqlPlus (клиента Oracle), коннект происходит, базу вижу и работаю с ней. НО ПРИЛОЖЕНИЕ МОЕ testdb.exe подсоединяться к базе не хочет!:( Захожу под debug и смотрю output, подцепляет ли мое приложение драйвер в итоге нахожу там строчки:
    'testdb.exe': Loaded 'C:\Qt\4.2.0\plugins\sqldrivers\qsqloci.dll', Binary was not built with debug information.
     'testdb.exe': Loaded 'C:\WINDOWS\system32\oci.dll', Binary was not built with debug information.

И в конце необъяснимым образом вот эти строки:
    QSqlDatabase: QOCI driver not loaded
    QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
.
Делаю вывод, что все же приложение мое не подгружает драйвер, ВОПРОС ПОЧЕМУ, ведь он подгружает нужные DLL?

Пробую после сборки драйвера запустить приложение тролей из demos (sqlbrowser.exe). В списке появляется драйвер, но при попытке подключения к базе выдается следующее сообщение:
   Failed to open database: QOCI: Unable to logon
   ORA-12154: TNS:could not resolve the connect identifier specified

Грустный( Люди помогите пожалуйста, что я делаю не так? Запарился прям уже:(
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2410

чтоб работа волком не казалась :)


Просмотр профиля WWW
« Ответ #1 : Май 16, 2007, 11:41 »

в папке с ехе-шкой создай подкаталог sqldrivers и положи туда qsqloci.dll.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1991



Просмотр профиля
« Ответ #2 : Май 16, 2007, 14:04 »

с ораклом и я долго парился
я правда использую otl.sf.net, а не стандартные драйвера от qt
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 543



Просмотр профиля WWW
« Ответ #3 : Май 18, 2007, 06:03 »

Попробуй законнектится, какой нить сторонней тулзой...
Не через Web, а именно со своего хоста по сети!
Я так и не смог завести этот грёбаный XE, тож писал нет доступа, причём и NetBeans ом тож пробовал (у него встроенный клиент для баз)...
Оракл просто не давал доступа из сети...
Так что забил и продолжаю юзать PostgreSQL.
Записан
dr_dizel
Гость
« Ответ #4 : Май 18, 2007, 08:39 »

Цитата: "AlexVK"
Создал папку в c:\XEClient, network\admin туда поместил файл tnsnames.ora, со следующим содержимым:
   
Код:
db_name=
        (DESCRIPTION =
               (ADDRESS_LIST =
                 (ADDRESS = (PROTOCOL = TCP)(HOST = ip_adres)(PORT = 1521)))
              (CONNECT_DATA =(SERVER = DEDICATED)(SID = db_name)))


Пробую после сборки драйвера запустить приложение тролей из demos (sqlbrowser.exe). В списке появляется драйвер, но при попытке подключения к базе выдается следующее сообщение:
   Failed to open database: QOCI: Unable to logon
   ORA-12154: TNS:could not resolve the connect identifier specified

Грустный( Люди помогите пожалуйста, что я делаю не так? Запарился прям уже:(

У тебя дескриптор не распознаётся. Ты вообще его болванку написал тут. Реально там нормальные IP, порт, имя экземпляра БД и выделенный слушатель?
А tnsping имени проходит?
Коннектится ли так:
Код:
sqlplus user/pass@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=123.456.789.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=my_service)))

Кстати: SERVICE_NAME!!!
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1991



Просмотр профиля
« Ответ #5 : Май 18, 2007, 12:18 »

я всегда думал - нафига так в оракле придумали
с service_name Улыбающийся
Записан
AlexVK
Гость
« Ответ #6 : Май 21, 2007, 07:38 »

dr_dizel, IP, порт, имя экземпляра БД - реальные (здесь привел болванку Улыбающийся, так как указывать настоящие в целях безопасности не стал), а вот что такое выделенный слушатель не знаю:(. tnsping проверить не смог, потомучто оказалось что у клиента (XEClient) Oracle нет вообще этого tnsping:(.

Попробывал так:
Цитировать
sqlplus user/pass@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=123.456.789.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=my_service))), только вместо SERVICE_NAME поставил SID (в sqlplus),
все работает к базе коннектится...

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

 А на счет использования другой СУБД, я бы с радостью использовал другую, например MySQL, тем более что с Oracl`ом вообще не знаком но требуют Oracle, требуют и все!!! Приходиться работать с ним:(
Записан
agatsky_den
Гость
« Ответ #7 : Август 17, 2008, 08:10 »

Люди только не пинайте по лицу ногами! Знаю что вопрос обсуждался сотни раз. Но никак не получается у меня подключиться к базе Oracle 10g! Использую коммерческую Qt 4.2.0 (проинтегрированная в VS 2005), ну соответственно Windows XP, поставил клиента Oracle 10g (XEClient, c:\XEClient).
1) Создал папку в c:\XEClient, network\admin туда поместил файл tnsnames.ora, со следующим содержимым:
  
Код:
db_name=
        (DESCRIPTION =
               (ADDRESS_LIST =
                 (ADDRESS = (PROTOCOL = TCP)(HOST = ip_adres)(PORT = 1521)))
              (CONNECT_DATA =(SERVER = DEDICATED)(SID = db_name)))

2) Собрал драйвер для Oracle:
   2.1. В командной строке VS 2005 command Prompt, прописал следующее:
      set INCLUDE=%INCLUDE%;c:\XEClient\oci\include
      set LIB=%LIB%;c:\XEClient\oci\lib\msvc
      cd %QTDIR%\src\plugins\sqldrivers\oci
      qmake -o Makefile oci.pro
      nmake
  В папке C:\Qt\4.2.0\plugins\sqldrivers, появились файлы: qsqloci.dll, qsqloci.dll.manifest, qsqloci.lib.

3) Создал проект Qt application.
  3.1. Создал файл для подключения connection.h.
      
Код:
#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

static bool createConnection()
{
                QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setUserName("user_name");
db.setPassword("password");
db.setHostName("ip");
db.setPort(1521);
db.setDatabaseName("db_name");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This example needs OCI support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}
return true;
}
#endif
  
3.2. Создал файл testdb.pro
      
Код:
TARGET = DB

       HEADERS = testdb.h connection.h
       SOURCES = main.cpp testdb.cpp

      FORMS = db.ui

    build_all:!build_pass {
        CONFIG -= build_all
        CONFIG += debug_and_release
    }
  3.3. в папку  c:\Windows\system32, положил oci.dll из клиента
    3.4. откомпилировал
    в VS 2005 prompt набрал set PATH=%PATH%;c:\XEClient\bin
    затем qmake -o Makefile testdb.pro
    затем nmake

Проверял на SqlPlus (клиента Oracle), коннект происходит, базу вижу и работаю с ней. НО ПРИЛОЖЕНИЕ МОЕ testdb.exe подсоединяться к базе не хочет!:( Захожу под debug и смотрю output, подцепляет ли мое приложение драйвер в итоге нахожу там строчки:
     'testdb.exe': Loaded 'C:\Qt\4.2.0\plugins\sqldrivers\qsqloci.dll', Binary was not built with debug information.
     'testdb.exe': Loaded 'C:\WINDOWS\system32\oci.dll', Binary was not built with debug information.

И в конце необъяснимым образом вот эти строки:
    QSqlDatabase: QOCI driver not loaded
    QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
.
Делаю вывод, что все же приложение мое не подгружает драйвер, ВОПРОС ПОЧЕМУ, ведь он подгружает нужные DLL?

Пробую после сборки драйвера запустить приложение тролей из demos (sqlbrowser.exe). В списке появляется драйвер, но при попытке подключения к базе выдается следующее сообщение:
   Failed to open database: QOCI: Unable to logon
   ORA-12154: TNS:could not resolve the connect identifier specified

Грустный( Люди помогите пожалуйста, что я делаю не так? Запарился прям уже:(
Была и меня проблема такая. Решил следующим образом:
1а. Собрал дрйвер (исправил ошибку "driver not loaded")
set INCLUDE=%INCLUDE%;D:\instantclient_11_1\sdk\include
set LIB=%LIB%;D:\instantclient_11_1\sdk\lib\msvc
qmake -o Makefile oci.pro
make
1б. Пересобрал qt c параметрами configure -qt-sql-oci -release -fast -shared -I "D:\instantclient_11_1\sdk\include" -L "D:\instantclient_11_1\sdk\lib\msvc"
2. Убрал лишние oci.dll (исправил ошибку Failed to open database: QOCI: Unable to logon) в окружении (c:\windows\system32\oci.dll), оставил только клиент D:\instantclient_11_1
ps Перерыл весь интернет с этой проблемой, спасибо всем кто помог.
Записан
spirit
Гость
« Ответ #8 : Август 17, 2008, 10:21 »

вставь эту строку
Код:
(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ip_adres)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = db_name)))
в
Код:
db.setDatabaseName(...);
т.е. должно выглядить так
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setUserName("user_name");
db.setPassword("password");
db.setDatabaseName("(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ip_adres)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = db_name)))");
у меня пашет на ура.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.077 секунд. Запросов: 22.