Как я могу подключиться к оракулу 12c через драйвер ODBC в Qt? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть qt с открытым исходным кодом 5.12 и ubuntu 18.04. Как мне подключиться к oracle 12c через ODBC? Я попробовал:

db = new QSqlDatabase(QSqlDatabase::addDatabase("QODBC"));
db->setPort(1234);
db->setDatabaseName("DRIVER={ODBC Driver 17 for SQL Server};"
                    "SERVER=localhost;"
                    "DATABASE=OraDoc;"
                    "Trusted_Connection=yes;");
db->setPassword("MyPasswd");
db->setUserName("system");
if(db->open()) qDebug() << "cool";
else qDebug() << db->lastError().text();

Пишет:

"[Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired
 [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x2749
 [Microsoft][ODBC Driver 17 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. QODBC3: Unable to connect"

1 Ответ

1 голос
/ 22 июня 2019

Исправленный ответ:

Действия по настройке и тестированию подключения ODBC к базе данных Oracle 12.2 в Qt Open Source 5.12 в Ubuntu 18.04:

1) Установите предварительные требования (если они еще не установлены).

sudo apt-get install build-essential libaio1

2) Установите диспетчер драйверов ODBC (unixODBC).

### Install packages
sudo apt-get install unixodbc unixodbc-dev

### Verify unixODBC installation
/usr/bin/odbcinst -j  

# Expected output:
unixODBC 2.3.4
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/<logged-in-user>/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

3) Установите драйвер Oracle ODBC.

### Download files below from
### https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-odbc-linux.x64-12.2.0.1.0-2.zip

### Unzip files to /opt/oracle
sudo unzip instantclient-basic-linux.x64-12.2.0.1.0.zip -d /opt/oracle
sudo unzip instantclient-odbc-linux.x64-12.2.0.1.0-2.zip -d /opt/oracle

4) Создайте файл tnsnames.ora и добавьте к нему соединение с базой данных.

### File: /opt/oracle/instantclient_12_2/network/admin/tnsnames.ora
oradbconn =
(
  DESCRIPTION =
  (
    ADDRESS_LIST =
      (ADDRESS =
        (PROTOCOL = TCP)
        (HOST = oradbserver.acme.com)
        (PORT = 1521)
       )
  )
  (
    CONNECT_DATA = (SERVICE_NAME = oradb.acme.com)
  )
)

5) Запустите odbc_update_ini.sh, который создает / обновляет конфигурацию unixODBC, необходимую для регистрации драйвера Oracle ODBC в unixODBC и частичной настройки источника данных Oracle ODBC.

cd /opt/oracle/instantclient_12_2
sudo ./odbc_update_ini.sh /

# This error can be ignored:
# *** ODBCINI environment variable not set,defaulting it to HOME directory!

Ожидаемое содержимое конфигурационных файлов unixODBC после запуска odbc_update_ini.sh:

### /etc/odbcinst.ini (Tells unixODBC where to find Oracle ODBC driver)
[Oracle 12c ODBC driver]
Description     = Oracle ODBC driver for Oracle 12c
Driver          = /opt/oracle/instantclient_12_2/libsqora.so.12.1
Setup           =
FileUsage       =
CPTimeout       =
CPReuse         = 

### ~/.odbc.ini (Partially-configured Oracle ODBC Data Source)
[OracleODBC-12c]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
.
.
.

6) "Chown" ~ / .odbc.ini для uid / gid текущего пользователя. Этот файл изначально создается как root: root. Если владелец не изменился, соединения с базой данных через драйвер ODBC могут потерпеть неудачу.

sudo chown $(id -u):$(id -g) ~/.odbc.ini

7) Завершите настройку источника данных, добавив / обновив параметры ~ / odbc.ini, показанные ниже.

### ~/.odbc.ini
ServerName = oradbconn    ### Should reference the connection in the tnsnames.ora file
UserID = oradb_user       ### User name for your Oracle database connection
Password = oradb_password ### Password for username above

9) Обновление .bash_profile с переменными среды Oracle и исходным файлом.

### ~/.bash_profile
export TNS_ADMIN=/opt/oracle/instantclient_12_2/network/admin
export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2

### Source the file
. ~/.bash_profile

10) Проверьте соединение с источником данных Oracle ODBC.

isql -v OracleODBC-12c

Ожидаемый результат:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

11) Создание программы для проверки подключения ODBC к Oracle.

your-project.pro:

.
.
QT += sql  ### Add this to make SQL libraries available 

main.cpp:

#include <iostream>
#include <QCoreApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

int main( int argc, char *argv[] )
{
    QCoreApplication a(argc, argv);

    // "OracleODBC-12c" is the data source configured in ~/.odbc.ini
    QSqlDatabase db = QSqlDatabase::addDatabase( "QODBC3", "OracleODBC-12c" );
    if(db.open())
        qDebug() << "Opened db connection!";
    else
        qDebug() << db.lastError().text();

    QSqlQuery query(db);

    // Example query selects a few table names from the system catalog
    query.exec("SELECT table_name FROM all_tables WHERE owner = 'SYS' and ROWNUM <= 3");

    while (query.next()) {
      QString table_name = query.value(0).toString();
      qDebug() << table_name;
    }

    return a.exec();
}

Ожидаемый результат (имена таблиц могут отличаться):

Opened db connection!
"DUAL"
"SYSTEM_PRIVILEGE_MAP"
"TABLE_PRIVILEGE_MAP"

Вышеуказанные шаги были проверены в следующей версии OS / Qt:

$ uname -a
Linux ubuntu 4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ ./qmake -v | grep Qt
Using Qt version 5.12.4 in /opt/Qt/5.12.4/gcc_64/lib

Оригинальный ответ:

Похоже, вы пытаетесь использовать драйвер ODBC для SQL Server для подключения к Oracle, что для меня не имеет смысла.

db->setDatabaseName("DRIVER={ODBC Driver 17 for SQL Server};"

Документация QT гласит:

Примечание: вы должны использовать собственный драйвер, если он доступен, вместо драйвер ODBC. Поддержка ODBC может использоваться как запасной вариант для совместимых базы данных, если нет собственного драйвера.

Информация о сборке с собственным драйвером Oracle OCI: здесь

Вы можете скачать мгновенный клиент Oracle, содержащий драйвер OCI, по адресу здесь . Согласно документации QT, вам понадобятся Instant Client Package - Basic "и" Instant Client Package - SDK ". Если вы все еще хотите использовать ODBC, вы можете попробовать загрузить Oracle" ODBC Package - Дополнительные библиотеки для включения приложений ODBC ". на странице мгновенной загрузки клиента. Для всех этих загрузок убедитесь, что вы получаете версию клиента, соответствующую вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...