Notas de estudio de QT: QT instala el controlador oci de Oracle
0. Antecedentes
En el proceso de usar QT para desarrollar aplicaciones, los datos generados durante el proceso de aplicación a menudo se colocan en la base de datos para un almacenamiento unificado. Por lo tanto, se puede decir que acceder a la base de datos a través de QT es un punto de conocimiento necesario. De hecho, la sintaxis y conocimiento relacionado de QT accediendo a la base de datos El uso de clases y métodos no es complicado, pero para los recién llegados que usan QT, a menudo se abre en el lugar donde se carga el controlador de la base de datos, como los siguientes problemas:
QSqlDatabase: controlador QPSQL no cargado
QSqlDatabase: controladores disponibles: QSQLITE QMARIADB QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
Aunque hay QPSQL en la lista de controladores QT, asegúrese de que no se pueda cargar. Hablemos sobre el problema del controlador de usar los datos del método QT correctamente.
Después de instalar el último paquete de instalación de QT, es compatible con las bases de datos ODBC y SQLITE de forma predeterminada. Si desea utilizar otras bases de datos, debe marcar la opción de código fuente al instalar QT.
1. Descripción del entorno y las condiciones
Sistema operativo: Windows 10 Professional Edition
Versión de la base de datos: Postgresql 14.6 (64 bits) (debe consultar la biblioteca y los archivos de encabezado aquí al compilar el controlador, o puede descargar directamente el paquete comprimido y descomprimirlo sin instalarlo) QT versión: 5.15.2
, y compruebe el
directorio de instalación de QT del código fuente durante la instalación: D:\Qt
Paquete de compilación QT 1: MinGW64 (los problemas de 32 y 64 bits deben ser coherentes con la base de datos)
Paquete de compilación QT 2: MSVC2019_64 (Diferentes conjuntos de compilación están integrados de forma predeterminada. Los controladores de la base de datos son diferentes, consulte los archivos de biblioteca en el directorio plugins/sqldrivers/ del conjunto para obtener más información).
2. Compilar el controlador
2.1 Descargar el cliente instantáneo de Oracle
1. Primero descargue oracleclient, porque al compilar el controlador oci, depende de la biblioteca y los archivos de encabezado en oracleclient. La dirección de descarga es:
https://www.oracle.com/database/technologies/instant-client/downloads.html
como se muestra en la siguiente figura:
La descarga de Oracle Instant Client debe coincidir con la versión del sistema operativo y la versión del servidor Oracle. Mi entorno de desarrollo es el sistema Windows10 de 64 bits, por lo que elegí Instant Client para Microsoft Windows (x64)
2. Después de hacer clic, aparecerá la selección de la versión de Oracle Instant Client, como se muestra en la siguiente figura: Las
diferentes versiones de Oracle Instant Client admiten diferentes versiones del servidor Oracle. La versión del servidor Oracle que uso es 11.2, y la versión seleccionada aquí es la Versión 19. xx.xxx, descargué 19.19 antes, y ahora es 19.20 cuando tomo una captura de pantalla, no hay mucha diferencia.
3. Después de hacer clic, puede ver la descarga de BasicPackage, SQL*Plus Package, Tools Package, SDK Package, JDBC Supplement Package, ODBC Package y otros paquetes, como se muestra en la siguiente figura:
La compilación de oci requiere al menos 2 paquetes, a saber, el paquete Baisc y el paquete SDK
4. Después de la descarga, como se muestra en la siguiente figura:
Luego descomprima los dos paquetes comprimidos de basic y sdk.
5. Copié la carpeta descomprimida en la unidad D. Se puede determinar si copiar o no según la situación real. Como se muestra abajo:
2.2 Compilar el controlador qt oci
2.2.1 Modificar oci.pro
1. Primero busque el código fuente del proyecto qt oci. Mi código fuente (recuerde verificar el código fuente al instalar QT) es el siguiente:
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\ oci
2, luego use qtcreator para abrir oci.pro y modifique el contenido de oci.pro (antes de modificar, es mejor hacer una copia de seguridad del proyecto oci), de la siguiente manera:
TARGET = qsqloci
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
#注释该行
#QMAKE_USE += oci
#根据Oracle客户端安装路径 指定oci.dll
QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll
#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include
#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -loci
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
Como se muestra abajo:
2.2.2 Compilación del kit de compilación MinGW64
1. Establezca el kit de compilación utilizado por el proyecto en qtcreator como MinGW64, como se muestra en la siguiente figura:
2. Realice la compilación de depuración y la compilación de lanzamiento respectivamente, y aparecerá la siguiente figura después de la compilación:
libqsqloci.a y qsqloci.dll generados en el directorio D:\plugins\sqldrivers, qsqloci.dll.debug
3. Deje que el programa QT encuentre el controlador compilado.
Al compilar el proyecto qt, la ruta para encontrar el controlador de la base de datos de forma predeterminada (tenga en cuenta que el kit de compilación utilizado por el proyecto es MinGw de 64 bits) es: D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers, por lo que necesita compilar los 3 generados en el paso anterior. Copie los archivos libqsqloci.a, qsqloci.dll y qsqloci.dll.debug en el directorio D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers. Como se muestra abajo:
2.2.3 Compilación del kit de compilación MSVC2019_64
1. Establezca el kit de compilación utilizado por el proyecto en qtcreator como MSVC2019_64, como se muestra en la siguiente figura:
En este momento, cuando cambie a la edición de código, encontrará un error que dice: ERROR del proyecto: versión msvc cargada pero QMAKE_MSC_VER no está configurado, como se muestra en la siguiente figura: para resolver
este problema, debemos configurar el valor de QMAKE_MSC_VER en D:\Qt\5.15.2\msvc2019_64\mkspecs\common\msvc-version.conf, Como se muestra abajo:
Nota: El valor de 1919 se debe encontrar en la lista de configuración de versión a continuación.
2. Luego cierre qtcreator, vuelva a abrir qtcreator y abra el proyecto oci.pro en qtcreator, y luego use el kit de compilación MSVC2019_64 para compilar, y ocurre otro error, el contenido es: LNK1107: el archivo no es válido o está dañado: no se puede leer en 0x2F8 - oci.dll, como se muestra a continuación:
Al compilar oci utilizando el paquete de compilación MSVC, no es necesario especificar la ruta de oci.dll en pro
Necesitamos modificar de nuevo el contenido del archivo pro. El contenido modificado es el siguiente:
TARGET = qsqloci
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
#注释该行
#QMAKE_USE += oci
#根据Oracle客户端安装路径 指定oci.dll
!msvc {
QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll
}
#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include
#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -loci
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
Como se muestra en la siguiente figura:
Después de esta modificación, ya sea que usemos el kit de compilación msvc o el kit de compilación mingw, se puede compilar normalmente.
3. Para evitar que los archivos de biblioteca generados al compilar el kit de compilación msvc se confundan con los archivos de biblioteca generados al compilar el kit de compilación mingw, primero eliminamos los archivos en el directorio D:\plugins\sqldrivers y luego compilamos el oci a través del kit de compilación msvc Después de completar la compilación El archivo de biblioteca generado es el siguiente:
4. Deje que el programa QT encuentre el controlador compilado.
Al compilar el proyecto qt, la ruta para buscar el controlador de la base de datos de forma predeterminada (tenga en cuenta que el kit de compilación utilizado por el proyecto es MSVC2019_64 bits) es: D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers, por lo que necesita para compilar los 3 generados en el paso anterior Copie los archivos libqsqloci.a, qsqloci.dll y qsqloci.dll.debug en el directorio D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers. Como se muestra abajo:
3. La base de datos de acceso se ejecuta correctamente
1. Debe especificar la ruta de la biblioteca oci a la que se hace referencia en el código
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci动态库加载失败!";
return;
}
2. El código de prueba completo es el siguiente:
#ifdef Q_OS_WIN
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci动态库加载失败!";
return;
}
#else
// QLibrary *oci_lib = new QLibrary("/usr/lib/oracleclient/instantclient_19_19/libclntsh.so");
// bool loadresult = oci_lib->load();
// qDebug() << "oracle oci动态库load result is " << loadresult;
// if (!loadresult)
// {
// qDebug() << oci_lib->errorString();
// }
// if (!oci_lib->isLoaded())
// {
// qDebug() << "oracle oci动态库libclntsh.so加载失败!";
// return;
// }
#endif
QStringList driverList = QSqlDatabase::drivers();
qDebug() << driverList;
//以下代码测试访问Oracle数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("172.16.12.6");
db.setPort(1521);
db.setDatabaseName("orcl");
db.setUserName("mes");
db.setPassword("oracle");
if (!db.open())
{
qDebug() << "数据库连接失败!";
}
else
{
qDebug() << "数据库连接成功!";
}
3. Los resultados de ejecución son los siguientes: