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:
inserte la descripción de la imagen aquí
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
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí
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
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/zlbdmm/article/details/132229969
Recomendado
Clasificación