Исправленный ответ:
Действия по настройке и тестированию подключения 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 ". на странице мгновенной загрузки клиента. Для всех этих загрузок убедитесь, что вы получаете версию клиента, соответствующую вашей базе данных.