En esta página

Controladores de bases de datos SQL

El módulo Qt SQL utiliza plugins de controladores para comunicarse con las diferentes APIs de bases de datos. Dado que la API del módulo SQL de Qt es independiente de la base de datos, todo el código específico de la base de datos está contenido en estos controladores. Con Qt se suministran varios controladores, a los que se pueden añadir otros. El código fuente del controlador se suministra y puede utilizarse como modelo para escribir sus propios controladores.

Bases de datos compatibles

La siguiente tabla enumera los controladores incluidos con Qt:

Nombre del controladorSGBD
QDB2IBM DB2 (versión 7.1 y superiores)
QIBASEBorland InterBase / Firebird
QMYSQL / MARIADBMySQL o MariaDB (versión 5.6 y superiores)
QOCIOracle Call Interface Driver (versión 12.1 y superiores)
QODBCOpen Database Connectivity (ODBC) - Microsoft SQL Server y otras bases de datos compatibles con ODBC
QPSQLPostgreSQL (versiones 7.3 y superiores)
QSQLITESQLite versión 3
QMIMERMimer SQL (versión 11 y superiores)

SQLite es el sistema de base de datos en proceso con la mejor cobertura de pruebas y soporte en todas las plataformas. Oracle a través de OCI, PostgreSQL y MySQL mediante ODBC o un controlador nativo están bien probados en Windows y Linux. La integridad del soporte para otros sistemas depende de la disponibilidad y calidad de las bibliotecas cliente.

Nota: Para crear un complemento de controlador, debe disponer de la biblioteca cliente adecuada para su sistema de gestión de bases de datos (SGBD). Ésta proporciona acceso a la API expuesta por el SGBD, y normalmente se suministra con él. La mayoría de los programas de instalación también permiten instalar "bibliotecas de desarrollo", que son las que necesitas. Estas bibliotecas se encargan de la comunicación de bajo nivel con el SGBD. Asegúrate también de instalar las librerías de base de datos correctas para tu arquitectura Qt (32 o 64 bits).

Nota: Cuando use Qt bajo términos de Código Abierto pero con una base de datos propietaria, verifique la compatibilidad de la licencia de la librería cliente con la LGPL.

Creación de los controladores

Compilar Qt con un controlador específico

El script Qt configure intenta detectar automáticamente las librerías cliente disponibles en tu máquina. Ejecute configure -help para ver qué controladores se pueden construir. Deberías obtener una salida similar a esta:

[...]

Database options:

  -sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
                         db2 ibase mysql oci odbc psql sqlite
                         [all auto]
  -sqlite .............. Select used sqlite [system/qt]

[...]

El script configure no puede detectar las librerías y archivos de inclusión necesarios si no están en las rutas estándar, por lo que puede ser necesario especificar estas rutas utilizando variables de ruta de inclusión y librería específicas del controlador o CMAKE_INCLUDE_PATH y CMAKE_LIBRARY_PATH. Por ejemplo, si sus archivos MySQL están instalados en C:\mysql-connector-c-6.1.11-winx64 en Windows, entonces pase el siguiente parámetro a la parte de doble guión de la línea configure:

C:\Qt\6.0.0\Src\configure.bat -sql-mysql -- -DMySQL_ROOT="C:\mysql-8.0.22-winx64"
Configure summary:

...
Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  Mimer SQL .............................. yes
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. no
  SQLite ................................. yes
    Using system provided SQLite ......... no
...

Cuando configure los controladores de la forma descrita anteriormente, CMake omitirá cualquier comprobación de dependencias y utilizará las rutas proporcionadas tal cual. Esto es especialmente útil si el paquete proporciona su propio conjunto de bibliotecas del sistema que no deben ser reconocidas por la rutina de compilación.

Las particularidades de cada controlador se explican a continuación.

Nota: Si algo va mal y desea CMake para volver a comprobar los controladores disponibles, puede que tenga que quitar CMakeCache.txt desde el directorio de construcción.

Compilar sólo un controlador SQL específico

Es posible compilar sólo un controlador SQL específico cuando Qt ya está compilado o instalado como versión binaria. Pero tienes que asegurarte de instalar exactamente la misma versión de los fuentes de Qt (por ejemplo a través de Qt Maintenance Tool) - de lo contrario podrías obtener errores de compilación debido a apis cambiados. También asegúrate de configurar correctamente el entorno de compilación ejecutando el símbolo del sistema Qt apropiado en el menú Inicio de Windows.

Una ejecución típica de qt-cmake (en este caso para configurar para MySQL) tiene este aspecto:

C:\Qt\6.0.0\mingw81_64\bin\qt-cmake -G Ninja C:\Qt\6.0.0\Src\qtbase\src\plugins\sqldrivers -DMySQL_INCLUDE_DIR="C:\mysql-8.0.22-winx64\include" -DMySQL_LIBRARY="C:\mysql-8.0.22-winx64\lib\libmysql.lib" -DCMAKE_INSTALL_PREFIX="C:\Qt\6.0.0\mingw81_64"
Configure summary:

Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  Mimer SQL .............................. yes
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. no
  SQLite ................................. yes
    Using system provided SQLite ......... no

-- Configuring done
-- Generating done
-- Build files have been written to: C:/build-qt6-sqldrivers

Después de configurar con qt-cmake, construya el controlador ejecutando ninja.

Nota: Como se menciona en Compilar Qt con un driver específico, si el driver no puede ser encontrado o no está habilitado, comience de nuevo eliminando CMakeCache.txt.

Debido a los aspectos prácticos de tratar con dependencias externas, sólo el plugin SQLite se entrega con las compilaciones binarias de Qt. Las versiones binarias de Qt para Windows también incluyen los plugins ODBC y PostgreSQL. Para poder añadir controladores adicionales a la instalación de Qt sin reconstruir todo Qt, es posible configurar y construir el directorio qtbase/src/plugins/sqldrivers fuera de un directorio de construcción completo de Qt. Tenga en cuenta que no es posible configurar cada controlador por separado, sólo todos ellos a la vez. Sin embargo, los controladores se pueden construir por separado.

Nota: Es necesario especificar CMAKE_INSTALL_PREFIX, si se desea instalar plugins una vez finalizada la compilación.

Controladores específicos

QMYSQL para MySQL o MariaDB 5.6 y superior

MariaDB es una bifurcación de MySQL destinada a permanecer como software libre y de código abierto bajo la Licencia Pública General GNU. MariaDB pretende mantener una alta compatibilidad con MySQL, asegurando una capacidad de reemplazo drop-in con paridad binaria de librerías y coincidencia exacta con las APIs y comandos de MySQL. Por lo tanto el plugin para MySQL y MariaDB se combinan en un plugin Qt.

Soporte Timestamp

Desde Qt 6.8, los valores de QDateTime se convierten a UTC antes de la inserción y de nuevo a UTC durante la recuperación. Para que esto funcione, el controlador establece la zona horaria de la conexión a UTC durante open() (SET time_zone = '+00:00'). Como MySQL no almacena ninguna información de zona horaria, esta información se pierde y todos los valores recuperados de QDateTime son UTC.

Soporte de procedimientos almacenados QMYSQL

MySQL tiene soporte para procedimientos almacenados a nivel SQL, pero no tiene API para controlar los parámetros IN, OUT e INOUT. Por lo tanto, los parámetros tienen que ser establecidos y leídos usando comandos SQL en lugar de QSqlQuery::bindValue().

Ejemplo de procedimiento almacenado:

create procedure qtestproc (OUT param1 INT, OUT param2 INT)
BEGIN
    set param1 = 42;
    set param2 = 43;
END

Código fuente para acceder a los valores OUT:

QSqlQuery q; q.exec("call qtestproc (@outval1, @outval2)"); q.exec("select @outval1, @outval2");if (q.next())    qDebug() << q.value(0) << q.value(1); // outputs "42" and "43"

Nota: @outval1 y @outval2 son variables locales de la conexión actual y no se verán afectadas por consultas enviadas desde otro host o conexión.

Servidor MySQL integrado

El servidor MySQL embebido es un reemplazo directo de la librería cliente normal. Con el servidor MySQL incrustado, no se requiere un servidor MySQL para utilizar la funcionalidad MySQL.

Para usar el servidor MySQL embebido, simplemente enlace el plugin Qt a libmysqld en lugar de libmysqlclient. Esto puede hacerse añadiendo -DMySQL_LIBRARY=<path/to/mysqld/>libmysqld.<so|lib|dylib> a la línea de comandos de configuración.

Por favor, consulte la documentación de MySQL, capítulo "libmysqld, the Embedded MySQL Server Library" para más información sobre el servidor MySQL embebido.

Opciones de conexión

El plugin Qt MySQL/MariaDB acepta las siguientes opciones de conexión:

AtributoValor posible
CLIENTE_COMPRIMIRSi se establece, cambia a protocolo comprimido después de una autenticación exitosa
CLIENT_FOUND_ROWSSi está establecido, envía las filas encontradas en lugar de las afectadas
CLIENT_IGNORE_SPACESi se establece, ignora los espacios antes de '('
CLIENT_NO_SCHEMASi se establece, no permitir database.table.column
CLIENT_INTERACTIVESi está establecido, el cliente es tratado como interactivo
MYSQL_OPT_PROTOCOLOespecifica explícitamente el protocolo a usar:
MYSQL_PROTOCOL_TCP: usa conexión tcp (ip/hostname especificado a través de setHostname()) MYSQL_PROTOCOL_SOCKET: conecta a través de un socket especificado en UNIX_SOCKET MYSQL_PROTOCOL_PIPE: conecta a través de un pipe con nombre especificado en UNIX_SOCKET MYSQL_PROTOCOL_MEMORY: conecta a través de memoria compartida especificada en MYSQL_SHARED_MEMORY_BASE_NAME
UNIX_SOCKETEspecifica el socket o tubería con nombre a usar, aunque se llame UNIX_SOCKET también se puede usar en windows
MYSQL_SHARED_MEMORY_BASE_NAMEEspecifica el nombre del segmento de memoria compartida a usar
MYSQL_OPT_RECONNECTTRUE o 1: Reconectar automáticamente después de la pérdida de conexión
FALSE o 0: Sin reconexión automática después de la pérdida de conexión (por defecto)
Ver Control Automático de Reconexión
MYSQL_OPT_CONNECT_TIMEOUTEl tiempo de espera de conexión en segundos
MYSQL_OPT_READ_TIMEOUTEl tiempo de espera en segundos para cada intento de lectura desde el servidor
MYSQL_OPT_WRITE_TIMEOUTEl tiempo de espera en segundos para cada intento de escritura en el servidor
MYSQL_OPT_LOCAL_INFILEEstablecido a 1 para habilitar el soporte para LOAD_DATA local, deshabilitado si no se establece o 0
MYSQL_OPT_SSL_MODEEl estado de seguridad a usar para la conexión al servidor: SSL_MODE_DISABLED, SSL_MODE_PREFERRED, SSL_MODE_REQUIRED, SSL_MODE_VERIFY_CA, SSL_MODE_VERIFY_IDENTITY. Sólo disponible cuando se enlaza con MySQL 5.7.10 o superior.
MYSQL_OPT_TLS_VERSIONUna lista de protocolos que el cliente permite para conexiones encriptadas. El valor puede ser una combinación de 'TLSv1' ,' TLSv1.1', 'TLSv1.2' o 'TLSv1.3' dependiendo de la versión del servidor MySQL usado. Sólo disponible cuando se enlaza con MySQL 5.7.11 o superior o MariaDB C Connector 3.1.10.
MYSQL_OPT_SSL_KEY / SSL_KEY (obsoleto)El nombre de la ruta del archivo de clave privada del cliente
MYSQL_OPT_SSL_CERT / SSL_CERT (obsoleto)El nombre de la ruta del archivo de certificado de clave pública del cliente
MYSQL_OPT_SSL_CA / SSL_CA (obsoleto)El nombre de la ruta del archivo de certificado de la Autoridad de Certificación (CA)
MYSQL_OPT_SSL_CAPATH / SSL_CAPATH (obsoleto)El nombre de la ruta del directorio que contiene los archivos de certificados SSL CA de confianza
MYSQL_OPT_SSL_CIPHER / SSL_CIPHER (obsoleto)La lista de cifrados permitidos para el cifrado SSL
MYSQL_OPT_SSL_CRLEl nombre de la ruta del fichero que contiene las listas de revocación de certificados
MYSQL_OPT_SSL_CRLPATHEl nombre de la ruta del directorio que contiene los ficheros que contienen las listas de revocación de certificados
MYSQL_OPT_SSL_VERIFY_SERVER_CERTTRUE o 1: Habilitar la verificación de la identidad del nombre común del servidor (por defecto)
FALSE o 0: Habilitar la verificación de la identidad del nombre común del servidor
Sólo disponible cuando se enlaza con MySQL 5.7.11 o MariaDB, eliminado con MySQL 8.0.

Para información más detallada acerca de las opciones de conexión por favor refiérase a la documentación de MySQL mysql_options().

Cómo construir el plugin QMYSQL en Unix y macOS

Necesita los archivos de cabecera de MySQL / MariaDB, así como la biblioteca compartida libmysqlclient.<so|dylib> / libmariadb.<so|dylib>. Dependiendo de tu distribución de Linux, puede que necesites instalar un paquete que normalmente se llama "mysql-devel" o "mariadb-devel".

Dígale a qt-cmake dónde encontrar los archivos de cabecera de MySQL / MariaDB y las bibliotecas compartidas (aquí se asume que MySQL / MariaDB está instalado en /usr/local) y compile:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DMySQL_ROOT="/usr/local/mysql"
cmake --build .
cmake --install .

Cómo Construir el Plugin QMYSQL en Windows

Necesita obtener los archivos de instalación de MySQL (p.e. MySQL web installer o MariaDB C Connector). Ejecuta el instalador, selecciona instalación personalizada e instala el Conector C de MySQL que coincida con tu instalación de Qt (x86 o x64). Después de la instalación comprueba que están los archivos necesarios:

  • <MySQL dir>/lib/libmysql.lib
  • <MySQL dir>/lib/libmysql.dll
  • <MySQL dir>/include/mysql.h

y para MariaDB

  • <MariaDB dir>/lib/libmariadb.lib
  • <MariaDB dir>/lib/libmariadb.dll
  • <MariaDB dir>/include/mysql.h

Nota: A partir de MySQL 8.0.19, el Conector C ya no se ofrece como un componente instalable independiente. En su lugar, puede obtener mysql.h y libmysql.* instalando el Servidor MySQL completo (sólo x64) o el Conector C MariaDB.

Construya el plugin como sigue (aquí se asume que <MySQL dir> es C:\mysql-8.0.22-winx64):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMySQL_ROOT="C:\mysql-8.0.22-winx64"
cmake --build .
cmake --install .

Cuando distribuyas tu aplicación, recuerda incluir libmysql.dll / libmariadb.dll en tu paquete de instalación. Debe colocarse en la misma carpeta que el ejecutable de la aplicación. libmysql.dll necesita además las librerías de ejecución MSVC que pueden instalarse con vcredist.exe

QOCI para la interfaz de llamada de Oracle (OCI)

El plugin Qt OCI soporta la conexión a bases de datos Oracle según lo determine la versión del cliente instantáneo utilizado. Esto depende de lo que Oracle indique que soporta. El plugin autodetectará la versión de la base de datos y habilitará las características en consecuencia.

Es posible conectarse a una base de datos Oracle sin un archivo tnsnames.ora. Esto requiere que el SID de la base de datos se pase al controlador como el nombre de la base de datos, y que se proporcione un nombre de host.

Autenticación de usuarios OCI

El plugin Qt OCI soporta autenticación usando credenciales externas (OCI_CRED_EXT). Normalmente, esto significa que el servidor de base de datos utilizará la autenticación de usuario proporcionada por el sistema operativo en lugar de su propio mecanismo de autenticación.

Deja el nombre de usuario y la contraseña vacíos cuando abras una conexión con QSqlDatabase para usar la autenticación por credenciales externas.

Soporte OCI BLOB/LOB

Los objetos binarios de gran tamaño (BLOB) pueden leerse y escribirse, pero ten en cuenta que este proceso puede requerir mucha memoria. Debe utilizar una consulta forward only para seleccionar campos LOB (consulte QSqlQuery::setForwardOnly()).

La inserción de BLOBs debe realizarse utilizando una consulta preparada en la que los BLOBs estén vinculados a marcadores de posición o QSqlTableModel, que utiliza una consulta preparada para hacerlo internamente.

Opciones de conexión

El plugin Qt OCI acepta las siguientes opciones de conexión:

AtributoValor posible
OCI_ATTR_PREFETCH_ROWSEstablece el atributo OCI OCI_ATTR_PREFETCH_ROWS al valor especificado.
OCI_ATTR_PREFETCH_MEMORYEstablece el atributo OCI OCI_ATTR_PREFETCH_MEMORY al valor especificado
OCI_AUTH_MODEOCI_SYSDBA: autenticar para acceso SYSDBA
OCI_SYSOPER: autenticar para acceso SYSOPER
OCI_DEFAULT: autenticar con acceso normal
ver OCISessionBegin para más información sobre los modos de acceso

Cómo construir el plugin OCI en Unix y macOS

Todo lo que necesitas es el " - Basic" y el "Instant Client Package - SDK".

Archivos de biblioteca de Oracle necesarios para construir el controlador:

  • libclntsh.<so|dylib> (todas las versiones)

Indique a qt-cmake dónde encontrar los archivos de cabecera y las bibliotecas compartidas de Oracle y compilarlos.

Suponemos que ha instalado los paquetes RPM del SDK de paquetes de cliente instantáneo (debe ajustar el número de versión en consecuencia):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DOracle_ROOT="/usr/include/oracle/21/client64"
cmake --build .
cmake --install .

Nota: Si está utilizando el paquete Cliente Instantáneo de Oracle, necesitará establecer LD_LIBRARY_PATH cuando construya el plugin OCI SQL, y cuando ejecute una aplicación que utilice el plugin OCI SQL.

Cómo compilar el plugin OCI en Windows

Elegir la opción "Programmer" en el instalador de Oracle Client del CD de instalación de Oracle Client suele ser suficiente para compilar el plugin. Para algunas versiones de Oracle Client, también puede ser necesario seleccionar la opción "Call Interface (OCI)" si está disponible.

Cree el plugin de la siguiente manera (aquí se asume que Oracle Client está instalado en C:\oracle y SDK está instalado en C:\oracle\sdk):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DOracle_ROOT="C:\oracle"
cmake --build .
cmake --install .

Cuando ejecute su aplicación, también necesitará añadir la ruta oci.dll a su variable de entorno PATH:

set PATH=%PATH%;C:\oracle

QODBC para Open Database Connectivity (ODBC)

ODBC es una interfaz general que permite conectarse a múltiples DBMS utilizando una interfaz común. El controlador QODBC permite conectarse a un gestor de controladores ODBC y acceder a las fuentes de datos disponibles. Tenga en cuenta que también debe instalar y configurar los controladores ODBC para el gestor de controladores ODBC instalado en su sistema. El plugin QODBC te permite utilizar estas fuentes de datos en tus aplicaciones Qt.

Nota: Debe utilizar el controlador nativo, si está disponible, en lugar del controlador ODBC. El soporte ODBC puede utilizarse como alternativa para las bases de datos compatibles si no se dispone de un controlador nativo.

En Windows, se instala por defecto un gestor de controladores ODBC. Para los sistemas Unix, existen algunas implementaciones que deben instalarse primero. Tenga en cuenta que todos los usuarios finales de su aplicación deben tener instalado un gestor de controladores ODBC; de lo contrario, el complemento QODBC no funcionará.

Cuando se conecte a una fuente de datos ODBC, debe pasar el nombre de la fuente de datos ODBC (DSN) a la función QSqlDatabase::setDatabaseName(), en lugar del nombre real de la base de datos. También es posible pasar un nombre de archivo FILEDSN (*.dsn) o una cadena de controlador ODBC completa. Al pasar una cadena de controlador debe asegurarse de que todos los parámetros (nombre de usuario, contraseña, ...) se escapan correctamente. Pasando el nombre de usuario o la contraseña a través de las funciones QSqlDatabase, el escape lo realiza el plugin QODBC.

El plugin QODBC necesita un controlador ODBC compatible con la versión 2.0 o superior. Algunos controladores ODBC dicen ser compatibles con la versión 2.0, pero no ofrecen toda la funcionalidad necesaria. Por ello, el plugin QODBC comprueba si la fuente de datos puede utilizarse después de establecer una conexión, y se niega a funcionar si la comprobación falla. Si no le gusta este comportamiento, puede eliminar la línea #define ODBC_CHECK_DRIVER del archivo qsql_odbc.cpp. Hágalo bajo su propia responsabilidad.

Por defecto, Qt indica al controlador ODBC que se comporte como un controlador ODBC 2.x. Sin embargo, para algunas combinaciones driver-manager/ODBC 3.x-driver (e.g., unixODBC/MaxDB ODBC), decirle al driver ODBC que se comporte como un driver 2.x puede causar que el plugin del driver tenga un comportamiento inesperado. Para evitar este problema, indique al controlador ODBC que se comporte como un controlador 3.x mediante setting the connect option "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3" antes de open your database connection. Tenga en cuenta que esto afectará a varios aspectos del comportamiento del controlador ODBC, por ejemplo, los SQLSTATE. Antes de configurar esta opción de conexión, consulte su documentación ODBC sobre las diferencias de comportamiento que puede esperar.

Si experimenta un acceso muy lento a la fuente de datos ODBC, asegúrese de que el rastreo de llamadas ODBC está desactivado en el gestor de fuentes de datos ODBC.

Algunos controladores no admiten cursores desplazables. En ese caso, sólo se pueden utilizar con éxito las consultas en modo QSqlQuery::setForwardOnly().

Soporte de marcas de tiempo

ODBC utiliza TIMESTAMP_STRUCT que no tiene información sobre ninguna zona horaria o similar. Debido a esto, se utiliza QDateTime sin respetar en absoluto la zona horaria.

Nota: : Esto podría cambiar en el futuro.

Soporte para procedimientos almacenados ODBC

Con Microsoft SQL Server, el conjunto de resultados devuelto por un procedimiento almacenado que utiliza la sentencia return, o devuelve múltiples conjuntos de resultados, sólo será accesible si se establece el modo forward only de la consulta a forward utilizando QSqlQuery::setForwardOnly().

// STORED_PROC uses the return statement or returns multiple result sets
QSqlQuery query;
query.setForwardOnly(true);
query.exec("{call STORED_PROC}");

Nota: El valor devuelto por la sentencia return del procedimiento almacenado se descarta.

Soporte Unicode ODBC

El complemento QODBC utilizará la API Unicode si se define UNICODE. En los sistemas basados en Windows, este es el valor predeterminado. Tenga en cuenta que el controlador ODBC y el SGBD también deben soportar Unicode.

Para el controlador ODBC de Oracle 9 (Windows), es necesario marcar "SQL_WCHAR support" en el gestor del controlador ODBC, de lo contrario Oracle convertirá todas las cadenas Unicode a la representación local de 8 bits.

Opciones de conexión

El complemento Qt ODBC admite las siguientes opciones de conexión:

AtributoValor posible
SQL_ATTR_ACCESS_MODESQL_MODE_READ_ONLY: abre la base de datos en modo sólo lectura
SQL_MODE_READ_WRITE: abre la base de datos en modo lectura-escritura (por defecto)
SQL_ATTR_LOGIN_TIMEOUTNúmero de segundos de espera para la conexión a la base de datos durante el inicio de sesión (un valor de 0 esperará para siempre)
SQL_ATTR_CONNECTION_TIMEOUTNúmero de segundos de espera para cualquier petición a la base de datos (un valor de 0 esperará para siempre)
SQL_ATTR_CURRENT_CATALOGCatálogo (base de datos) que se utilizará para esta conexión
SQL_ATTR_METADATA_IDSQL_TRUE: los argumentos de cadena de las funciones de catálogo se tratan como identificadores
SQL_FALSE: los argumentos de cadena de las funciones de catálogo no se tratan como identificadores
SQL_ATTR_PACKET_SIZEIndica el tamaño del paquete de red en bytes
SQL_ATTR_TRACEFILECadena que contiene el nombre del archivo de rastreo
SQL_ATTR_TRACESQL_OPT_TRACE_ON: Activa el seguimiento de consultas a la base de datos
SQL_OPT_TRACE_OFF: Desactiva el seguimiento de consultas a la base de datos (por defecto)
SQL_ATTR_CONNECTION_POOLINGActivar o desactivar la agrupación de conexiones a nivel de entorno.
SQL_CP_DEFAULT, SQL_CP_OFF: La agrupación de conexiones está desactivada (por defecto)
SQL_CP_ONE_PER_DRIVER: Se admite una única agrupación de conexiones para cada controlador
SQL_CP_ONE_PER_HENV: Se admite una única agrupación de conexiones para cada entorno
SQL_ATTR_ODBC_VERSIONSQL_OV_ODBC3: El driver debe actuar como un driver ODBC 3.x
SQL_OV_ODBC2: El driver debe actuar como un driver ODBC 2.x (por defecto)

Para información más detallada sobre las opciones de conexión, por favor consulte la documentación ODBC de SQLSetConnectAttr().

Cómo crear el complemento ODBC en Unix y macOS

Se recomienda utilizar unixODBC. Puedes encontrar la última versión y los drivers ODBC en http://www.unixodbc.org. Necesitas los archivos de cabecera unixODBC y las librerías compartidas.

Indique a qt-cmake dónde encontrar los ficheros de cabecera unixODBC y las librerías compartidas (aquí se asume que unixODBC está instalado en /usr/local/unixODBC) y compile:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DODBC_INCLUDE_DIR="/usr/local/unixODBC/include" -DODBC_LIBRARY="/usr/local/unixODBC/lib/libodbc.<so|dylib>"
cmake --build .
cmake --install .

Cómo construir el plugin ODBC en Windows

La cabecera ODBC y los archivos de inclusión ya deberían estar instalados en los directorios correctos. Sólo tienes que compilar el plugin de la siguiente manera:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform>
cmake --build .
cmake --install .

QPSQL para PostgreSQL (Versión 7.3 y superiores)

El controlador QPSQL soporta la versión 7.3 y superiores del servidor PostgreSQL.

Para más información sobre PostgreSQL visite http://www.postgresql.org.

Soporte Timestamp

Desde Qt 6.8, los valores de QDateTime se convierten a UTC antes de la inserción y de nuevo a UTC durante la recuperación. Para que esto funcione, el controlador establece la zona horaria de la conexión a UTC durante open() (SET TIME ZONE 'UTC'). Aunque PostgreSQL tiene el tipo de columna `timestamptz`, la zona horaria utilizada durante la inserción no se conserva y por lo tanto todos los valores recuperados de QDateTime son UTC.

Soporte QPSQL Unicode

El controlador QPSQL detecta automáticamente si la base de datos PostgreSQL a la que se está conectando soporta Unicode o no. Unicode se utiliza automáticamente si el servidor lo soporta. Tenga en cuenta que el controlador sólo soporta la codificación UTF-8. Si su base de datos utiliza cualquier otra codificación, el servidor debe estar compilado con soporte de conversión Unicode.

El soporte Unicode fue introducido en la versión 7.1 de PostgreSQL y sólo funcionará si tanto el servidor como la librería cliente han sido compilados con soporte multibyte. Puede encontrar más información sobre cómo configurar un servidor PostgreSQL con soporte multibyte en la Guía del Administrador de PostgreSQL, Capítulo 5.

Sensibilidad a mayúsculas y minúsculas en QPSQL

Las bases de datos PostgreSQL sólo respetarán la distinción entre mayúsculas y minúsculas si el nombre de la tabla o del campo se entrecomilla cuando se crea la tabla. Así, por ejemplo, una consulta SQL como:

CREATE TABLE "testTable" ("id" INTEGER);

se asegurará de que se puede acceder con el mismo caso que se utilizó. Si el nombre de la tabla o del campo no se entrecomilla cuando se crea, el nombre real de la tabla o del campo se escribirá en minúsculas. Cuando QSqlDatabase::record() o QSqlDatabase::primaryIndex() acceden a una tabla o campo que no estaba entrecomillado cuando se creó, el nombre pasado a la función debe estar en minúsculas para garantizar que se encuentra. Por ejemplo:

QString tableString("testTable");
QSqlQuery q;
// Create table query is not quoted, therefore it is mapped to lower case
q.exec(QString("CREATE TABLE %1 (id INTEGER)").arg(tableString));
// Call toLower() on the string so that it can be matched
QSqlRecord rec = database.record(tableString.toLower());

Soporte de consultas QPSQL Forward-only

Para utilizar consultas de sólo avance, debe construir el complemento QPSQL con la biblioteca cliente PostreSQL versión 9.2 o posterior. Si el complemento se construye con una versión anterior, el modo sólo hacia adelante no estará disponible - llamar a QSqlQuery::setForwardOnly() con true no tendrá ningún efecto.

Advertencia: Si construyes el plugin QPSQL con PostgreSQL versión 9.2 o posterior, entonces debes distribuir tu aplicación con libpq versión 9.2 o posterior. De lo contrario, la carga del plugin QPSQL fallará con el siguiente mensaje:

QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMARIADB QODBC QPSQL
Could not create database object

Mientras se navega por los resultados en modo forward-only, el handle de QSqlResult puede cambiar. Las aplicaciones que utilizan el manejador de bajo nivel del resultado SQL deben obtener un nuevo manejador después de cada llamada a cualquiera de las funciones de obtención de QSqlResult. Ejemplo:

QSqlQuery query;
QVariant v;
query.setForwardOnly(true);
query.exec("SELECT * FROM table");
while (query.next()) {
    // Handle changes in every iteration of the loop
    v = query.result()->handle();

    if (qstrcmp(v.typeName(), "PGresult*") == 0) {
        PGresult *handle = *static_cast<PGresult **>(v.data());
        if (handle) {
            // Do something...
        }
    }
}

Mientras se leen los resultados de una consulta forward-only con PostgreSQL, la conexión a la base de datos no puede utilizarse para ejecutar otras consultas. Esta es una limitación de la librería libpq. Ejemplo:

int value;
QSqlQuery query1;
query1.setForwardOnly(true);
query1.exec("select * FROM table1");
while (query1.next()) {
    value = query1.value(0).toInt();
    if (value == 1) {
        QSqlQuery query2;
        query2.exec("update table2 set col=2");  // WRONG: This will discard all results of
    }                                            // query1, and cause the loop to quit
}

Este problema no ocurrirá si query1 y query2 utilizan conexiones de base de datos diferentes, o si ejecutamos query2 después del bucle while.

Nota: Algunos métodos de QSqlDatabase como tables(), primaryIndex() ejecutan implícitamente consultas SQL, por lo que tampoco pueden utilizarse mientras se navega por los resultados de una consulta forward-only.

Nota: QPSQL imprimirá la siguiente advertencia si detecta una pérdida de resultados de consulta:

QPSQLDriver::getResult: Query results lost - probably discarded on executing another SQL query.

Opciones de conexión

El plugin Qt PostgreSQL respeta todas las opciones de conexión especificadas en la documentación de connect() PostgreSQL.

Cómo construir el plugin QPSQL en Unix y macOS

Necesita tener instalada la librería cliente PostgreSQL y las cabeceras.

Para hacer que qt-cmake encuentre los archivos de cabecera PostgreSQL y las bibliotecas compartidas, construya el plugin de la siguiente manera (asumiendo que el cliente PostgreSQL está instalado en /usr/local/pgsql):

mkdir build-psql-driver
cd build-psql-driver

qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers-DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DPostgreSQL_ROOT="/usr/local/pgsql"
cmake --build .
cmake --install .

Cómo construir el plugin QPSQL en Windows

Instale las librerías de desarrollo PostgreSQL apropiadas para su compilador. Asumiendo que PostgreSQL fue instalado en C:\pgsql, construya el plugin como sigue:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DPostgreSQL_ROOT="C:\pgsql"
cmake --build .
cmake --install .

Los usuarios de MinGW pueden consultar el siguiente documento en línea: PostgreSQL MinGW/Nativo Windows.

Cuando distribuya su aplicación, recuerde incluir libpq.dll en su paquete de instalación. Debe colocarse en la misma carpeta que el ejecutable de la aplicación.

QDB2 para IBM DB2 (versión 7.1 y superiores)

El plugin Qt DB2 permite acceder a bases de datos IBM DB2. Ha sido probado con IBM DB2 v7.1 y 7.2. Debe instalar la biblioteca cliente de desarrollo de IBM DB2, que contiene los archivos de cabecera y biblioteca necesarios para compilar el plugin QDB2.

El controlador QDB2 admite consultas preparadas, lectura/escritura de cadenas Unicode y lectura/escritura de BLOB.

Sugerimos utilizar una consulta preparada al llamar a procedimientos almacenados en DB2 (véase QSqlQuery::setForwardOnly()).

Opciones de conexión

El plugin Qt IBM DB2 acepta las siguientes opciones de conexión:

AtributoValor posible
SQL_ATTR_ACCESS_MODESQL_MODE_READ_ONLY: abre la base de datos en modo sólo lectura
SQL_MODE_READ_WRITE: abre la base de datos en modo lectura-escritura (por defecto)
SQL_ATTR_LOGIN_TIMEOUTNúmero de segundos de espera para la conexión a la base de datos durante el inicio de sesión (máximo: 32767, un valor de 0 esperará para siempre)

Cómo construir el plugin QDB2 en Unix y macOS

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DDB2_ROOT="/usr/local/db2"
cmake --build .
cmake --install .

Cómo construir el plugin QDB2 en Windows

Los archivos de cabecera y de inclusión de DB2 ya deberían estar instalados en los directorios correctos. Sólo tienes que construir el plugin de la siguiente manera:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DDB2_ROOT="C:\db2"
cmake --build .
cmake --install .

QSQLITE para SQLite (Versión 3 y superiores)

El plugin Qt SQLite permite acceder a bases de datos SQLite. SQLite es una base de datos en proceso, lo que significa que no es necesario disponer de un servidor de bases de datos. SQLite opera sobre un único archivo, que debe establecerse como nombre de la base de datos al abrir una conexión. Si el archivo no existe, SQLite intentará crearlo. SQLite también soporta bases de datos en memoria y temporales. Basta con pasar respectivamente ":memory:" o una cadena vacía como nombre de la base de datos.

SQLite tiene algunas restricciones en cuanto a usuarios múltiples y transacciones múltiples. Si intentas leer/escribir en un recurso desde diferentes transacciones, tu aplicación podría congelarse hasta que una de las transacciones haga commit o roll back. El controlador SQLite de Qt volverá a intentar escribir en un recurso bloqueado hasta que se agote el tiempo de espera (véase QSQLITE_BUSY_TIMEOUT en QSqlDatabase::setConnectOptions()).

En SQLite cualquier columna, con la excepción de una columna INTEGER PRIMARY KEY, puede ser utilizada para almacenar cualquier tipo de valor. Por ejemplo, una columna declarada como INTEGER puede contener un valor entero en una fila y un valor de texto en la siguiente. Esto se debe a que SQLite asocia el tipo de un valor con el propio valor y no con la columna en la que se almacena. Una consecuencia de esto es que el tipo devuelto por QSqlField::metaType() sólo indica el tipo recomendado del campo. No se debe asumir el tipo real y se debe comprobar el tipo de los valores individuales.

El controlador se bloquea para actualizaciones mientras se ejecuta una selección. Esto puede causar problemas cuando se utiliza QSqlTableModel porque las vistas de elementos de Qt obtienen datos cuando es necesario (con QSqlQuery::fetchMore() en el caso de QSqlTableModel).

Puedes encontrar información sobre SQLite en http://www.sqlite.org.

Soporte Timestamp

SQLite no tiene un tipo de columna timestamp especial. Una QDateTime se almacena como cadena, formateada en Qt::ISODateWithMs y por lo tanto la información de la zona horaria QDateTime se conserva durante la inserción y selección.

Opciones de conexión

El plugin Qt SQLite acepta las siguientes opciones de conexión:

AtributoValor posible
QSQLITE_BUSY_TIMEOUTBusy handler timeout en milisegundos (val <= 0: desactivado), ver documentación de SQLite para más información
QSQLITE_USE_QT_VFSSi se establece, la base de datos se abre usando el VFS de Qt que permite abrir bases de datos usando QFile. De esta forma se pueden abrir bases de datos desde cualquier ubicación de lectura-escritura (p.ej. almacenamiento compartido android) pero también desde recursos de sólo lectura (p.ej. qrc o android assets). Ten en cuenta que cuando abras bases de datos desde recursos de solo lectura asegurate de añadir tambien el atributo QSQLITE_OPEN_READONLY. De lo contrario fallará al abrirla.
QSQLITE_OPEN_READONLYSi se establece, la base de datos se abrirá en modo solo lectura, lo que fallará si no existe ninguna base de datos. En caso contrario, la base de datos se abrirá en modo lectura-escritura y se creará si el archivo de base de datos aún no existe (por defecto)
QSQLITE_OPEN_URIEl nombre de fichero dado se interpreta como una uri, ver SQLITE_OPEN_URI
QSQLITE_ENABLE_SHARED_CACHESi se establece, la base de datos se abre en modo de caché compartida, en caso contrario en modo de caché privada
QSQLITE_ENABLE_REGEXPSi se establece, el complemento define una función 'regex' que puede utilizarse en las consultas, QRegularExpression se utiliza para la evaluación de la consulta regex
QSQLITE_NO_USE_EXTENDED_RESULT_CODESDesactiva el uso del código de resultado extendido en SQLite
QSQLITE_ENABLE_NON_ASCII_CASE_FOLDINGSi se activa, el plugin sustituye las funciones 'lower' y 'upper' por las funciones QString para el correcto plegado de mayúsculas y minúsculas de caracteres no-ascii.
QSQLITE_OPEN_NOFOLLOWSi se define, no se permite que el nombre de archivo de la base de datos contenga un enlace simbólico.

Cómo construir el plugin QSQLITE

SQLite versión 3 se incluye como una librería de terceros dentro de Qt. Se puede construir pasando el parámetro -DFEATURE_system_sqlite=OFF a la línea de comandos qt-cmake.

Si no desea utilizar la librería SQLite incluida con Qt, puede pasar -DFEATURE_system_sqlite=ON a la línea de comandos qt-cmake para utilizar las librerías SQLite del sistema operativo. Esto se recomienda siempre que sea posible, ya que reduce el tamaño de la instalación y elimina un componente para el que es necesario realizar un seguimiento de los avisos de seguridad.

En Unix y macOS (sustituya $SQLITE por el directorio donde reside SQLite):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DFEATURE_system_sqlite=ON -DCMAKE_INCLUDE_PATH="$SQLITE/include" -DCMAKE_LIBRARY_PATH="$SQLITE/lib"
cmake --build .
cmake --install .

En Windows (suponiendo que SQLite esté instalado en C:\SQLITE):

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DFEATURE_system_sqlite=ON -DCMAKE_INCLUDE_PATH="C:\SQLITE\include" -DCMAKE_LIBRARY_PATH="C:\SQLITE\lib"
cmake --build .
cmake --install .

Activar el operador REGEXP

SQLite viene con una operación REGEXP. Sin embargo, la implementación necesaria debe ser proporcionada por el usuario. Para mayor comodidad se puede habilitar una implementación por defecto en setting the connect option QSQLITE_ENABLE_REGEXP antes de the database connection is opened. Entonces una sentencia SQL como "column REGEXP 'pattern'" básicamente se expande al código Qt

column.contains(QRegularExpression("pattern"));

Para mejorar el rendimiento, las expresiones regulares se almacenan internamente en caché. Por defecto el tamaño de la caché es 25, pero puede cambiarse a través del valor de la opción. Por ejemplo pasando "QSQLITE_ENABLE_REGEXP=10" se reduce el tamaño de la caché a 10.

Compatibilidad con formatos de archivo QSQLITE

Las versiones menores de SQLite a veces rompen la compatibilidad de formatos de archivo. Por ejemplo, SQLite 3.3 puede leer archivos de bases de datos creados con SQLite 3.2, pero las bases de datos creadas con SQLite 3.3 no pueden ser leídas por SQLite 3.2. Consulte la documentación de SQLite y los registros de cambios para obtener información sobre la compatibilidad de formatos de archivo entre versiones.

Las versiones menores de Qt normalmente siguen a las versiones menores de SQLite, mientras que las versiones de parches de Qt siguen a las versiones de parches de SQLite. Por lo tanto, los parches son compatibles con versiones anteriores y posteriores.

Para forzar a SQLite a usar un formato de archivo específico, es necesario construir y enviar su propio plugin de base de datos con su propia librería SQLite como se ilustra arriba. Algunas versiones de SQLite pueden ser forzadas a escribir un formato de archivo específico estableciendo la definición SQLITE_DEFAULT_FILE_FORMAT cuando se construye SQLite.

QMIMER para Mimer SQL versión 11 y superiores

El plugin Qt Mimer SQL permite trabajar con el RDBMS Mimer SQL. Mimer SQL proporciona soluciones de bases de datos relacionales pequeñas, escalables y robustas que se ajustan a los estándares internacionales ISO SQL. Mimer SQL está disponible en Windows, Linux, macOS y OpenVMS, así como en varias plataformas embebidas como QNX, Android y Linux embebido.

Mimer SQL es totalmente compatible con Unicode. Para trabajar con datos Unicode se deben utilizar los tipos de columna National Character (NCHAR), National Character Varying (NVARCHAR), o National Character Large Object (NCLOB). Para más información sobre Mimer SQL y unicode, consulte https://developer.mimer.com/features/multilingual-support

Soporte de marcas de tiempo

MimerSQL no sabe nada acerca de las zonas horarias y QDateTime se utiliza sin honrar la zona horaria en absoluto.

Nota: : Esto podría cambiar en el futuro.

Soporte de Procedimientos Almacenados QMIMER

Mimer SQL tiene procedimientos almacenados de acuerdo al estandar SQL (PSM) y el plugin soporta completamente parametros IN, OUT, INOUT asi como procedimientos resultset.

Ejemplo de procedimiento almacenado con parámetros INOUT y OUT:

create procedure inout_proc (INOUT param1 INT, OUT param2 INT)
BEGIN
    set param1 = param1 * 2;
    set param2 = param1 * param1;
END

Código fuente para acceder a los valores INOUT y OUT:

    QSqlDatabase db;
    QSqlQuery query;
    int i1 = 10, i2 = 0;
    query.prepare("call qtestproc(?, ?)");
    query.bindValue(0, i1, QSql::InOut);
    query.bindValue(1, i2, QSql::Out);
    query.exec();

Cómo construir el plugin QMIMER en Unix y macOS

Necesitas los ficheros de cabecera y las librerías compartidas de Mimer SQL. Consíguelos instalando cualquiera de las variantes de Mimer SQL que se encuentran en https://developer.mimer.com.

mkdir build-sqldrivers
cd build-sqldrivers

qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMimer_INCLUDE_DIR="/usr/include" -DMimer_LIBRARIES="/usr/lib/libmimer.so"
cmake --build .
cmake --install .

Cómo construir el plugin QMIMER en Windows

Necesitas los archivos de cabecera y las librerías compartidas de Mimer SQL. Consíguelos instalando cualquiera de las variantes de Mimer SQL que se encuentran en https://developer.mimer.com.

mkdir build-sqldrivers
cd build-sqldrivers

qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DMimer_INCLUDE_DIR="C:\Program Files\Mimer SQL Experience 11.0\dev\include" -DMimer_LIBRARIES="C:\Program Files\Mimer SQL Experience 11.0\dev\lib\amd64\mimapi64.lib|C:\Program Files\Mimer SQL Experience 11.0\dev\lib\x86\mimapi32.lib"
cmake --build .
cmake --install .

QIBASE para Borland InterBase

El plugin Qt InterBase permite acceder a las bases de datos InterBase y Firebird. InterBase puede utilizarse como cliente/servidor o sin servidor, en cuyo caso opera sobre ficheros locales. El fichero de base de datos debe existir antes de poder establecer una conexión. Firebird debe utilizarse con una configuración de servidor.

Tenga en cuenta que InterBase requiere que especifique la ruta completa al archivo de base de datos, independientemente de que esté almacenado localmente o en otro servidor.

Soporte de marcas de tiempo

Interbase almacena las marcas de tiempo en UTC sin ninguna información de zona horaria. Debido a esto, el QDateTime se utiliza sin honrar la zona horaria en absoluto.

Desde Firebird 4.0, la base de datos soporta marcas de tiempo con zonas horarias. La información de la zona horaria se almacena separada de la marca de tiempo para que pueda ser recuperada correctamente más tarde. Consulte la documentación de Firebird para más información sobre el manejo de marcas de tiempo.

Opciones de conexión

El plugin Qt Borland InterBase acepta las siguientes opciones de conexión:

AtributoValor posible
ISC_DPB_SQL_ROLE_NAMEEspecifica el nombre del rol de inicio de sesión

Cómo construir el plugin QIBASE

QSqlDatabase db;
db.setHostName("MyServer");
db.setDatabaseName("C:\\test.gdb");

Necesitas las cabeceras y librerías de desarrollo de InterBase/Firebird para construir este plugin.

Debido a incompatibilidades de licencia con la GPL, los usuarios de Qt Open Source Edition no pueden enlazar este plugin con las ediciones comerciales de InterBase. Por favor, utilice Firebird o la edición gratuita de InterBase.

Procedimientos almacenados de QIBASE

InterBase/Firebird devuelven valores OUT como conjunto de resultados, por lo que cuando se llama a un procedimiento almacenado, sólo los valores IN necesitan ser vinculados a través de QSqlQuery::bindValue(). Los valores RETURN/OUT pueden ser recuperados a través de QSqlQuery::value(). Ejemplo:

QSqlQuery q; q.exec("ejecutar procedimiento mi_procedimiento");if (q.next())    qDebug() << q.value(0); // outputs the first RETURN/OUT value

Cómo construir el plugin QIBASE en Unix y macOS

Lo siguiente asume que InterBase o Firebird está instalado en /opt/interbase:

Si está usando InterBase:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_source_directory>/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>/<platform> -DInterbase_ROOT="/opt/interbase/"
cmake --build .
cmake --install .

Opcionalmente, utilice las variables CMake Interbase_INCLUDE_DIR y Interbase_LIBRARY para especificar la ruta de inclusión y la biblioteca directamente.

Cómo construir el plugin QIBASE en Windows

Lo siguiente asume que InterBase o Firebird está instalado en C:\interbase:

Si está usando InterBase:

mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DInterbase_ROOT="C:\interbase"
cmake --build .
cmake --install .

Opcionalmente, utilice las variables CMake Interbase_INCLUDE_DIR y Interbase_LIBRARY para especificar la ruta de inclusión y la biblioteca directamente.

Tenga en cuenta que C:\interbase\bin debe estar en el directorio PATH.

Solución de problemas

Siempre debe utilizar bibliotecas cliente que hayan sido compiladas con el mismo compilador que esté utilizando para su proyecto. Si no puede conseguir una distribución de fuentes para compilar las bibliotecas cliente usted mismo, debe asegurarse de que la biblioteca precompilada es compatible con su compilador, de lo contrario obtendrá muchos errores de "símbolos indefinidos".

Si la compilación de un plugin tiene éxito pero no se puede cargar después, comprueba los siguientes pasos para encontrar al culpable:

  1. Asegúrate de que el plugin está en el directorio correcto. Puedes usar QApplication::libraryPaths() para determinar donde busca Qt los plugins.
  2. Asegúrate de que las librerías cliente del SGBD están disponibles en el sistema. En Unix, ejecute el comando ldd y pase el nombre del plugin como parámetro, por ejemplo ldd libqsqlmysql.so. Recibirá una advertencia si no se encuentra alguna de las bibliotecas cliente. En Windows, puede utilizar el navegador de dependencias de Visual Studio o la interfaz gráfica de usuario de dependencias para encontrar las bibliotecas dependientes. Con Qt Creator, puede actualizar la variable de entorno PATH en la sección Ejecutar del panel Proyecto para incluir la ruta a la carpeta que contiene las bibliotecas cliente.
  3. Cuando utilices MSVC, asegúrate también de que el plugin está compilado con el tipo de compilación correcto. Debido a los diferentes tiempos de ejecución de MSVC para depuración y liberación, una compilación de depuración Qt no puede cargar un plugin de liberación Qt y viceversa.
  4. Ejecute el ejecutable Qt compilado con la variable de entorno QT_DEBUG_PLUGINS establecida para obtener una salida de depuración muy detallada al cargar plugins.
  5. Para recuperar posibles mensajes de depuración del subsistema SQL, habilita la salida estableciendo la variable de entorno QT_LOGGING_RULES en qt.sql.*.debug=true. No olvide habilitar la consola cuando trabaje en Windows. Consulte Logging Rules para obtener una explicación más detallada sobre cómo establecer reglas de registro.

Asegúrate de que has seguido la guía de Despliegue de Plugins.

Cómo escribir su propio controlador de base de datos

QSqlDatabase es responsable de cargar y gestionar los plugins del controlador de base de datos. Cuando se añade una base de datos (ver QSqlDatabase::addDatabase()), se carga el plugin controlador apropiado (usando QSqlDriverPlugin). QSqlDatabase depende del plugin controlador para proporcionar interfaces para QSqlDriver y QSqlResult.

QSqlDriver es una clase base abstracta que define la funcionalidad de un controlador de base de datos SQL. Esto incluye funciones como QSqlDriver::open() y QSqlDriver::close(). QSqlDriver es responsable de conectarse a una base de datos, establecer el entorno adecuado, etc. Además, QSqlDriver puede crear objetos QSqlQuery apropiados para la API de base de datos concreta. QSqlDatabase reenvía muchas de sus llamadas a funciones directamente a QSqlDriver, que proporciona la implementación concreta.

QSqlResult es una clase base abstracta que define la funcionalidad de una consulta a una base de datos SQL. Incluye sentencias como SELECT, UPDATE, y ALTER TABLE . QSqlResult contiene funciones como QSqlResult::next() y QSqlResult::value(). QSqlResult es responsable de enviar consultas a la base de datos, devolver datos de resultados, etc. QSqlQuery reenvía muchas de sus llamadas a funciones directamente a QSqlResult que proporciona la implementación concreta.

QSqlDriver y QSqlResult están estrechamente relacionados. Cuando se implementa un controlador Qt SQL, ambas clases deben ser subclasificadas y los métodos virtuales abstractos de cada clase deben ser implementados.

Para implementar un controlador Qt SQL como un plugin (de modo que sea reconocido y cargado por la biblioteca Qt en tiempo de ejecución), el controlador debe utilizar la macro Q_PLUGIN_METADATA(). Lea Cómo crear plugins Q t para más información sobre esto. También puede comprobar cómo se hace esto en los plugins SQL que se proporcionan con Qt en QTDIR/qtbase/src/plugins/sqldrivers.

El siguiente código puede usarse como esqueleto para un controlador SQL:

class XyzResult : public QSqlResult
{
public:
    XyzResult(const QSqlDriver *driver)
        : QSqlResult(driver) {}
    ~XyzResult() {}

protected:
    QVariant data(int /* index */) override { return QVariant(); }
    bool isNull(int /* index */) override { return false; }
    bool reset(const QString & /* query */) override { return false; }
    bool fetch(int /* index */) override { return false; }
    bool fetchFirst() override { return false; }
    bool fetchLast() override { return false; }
    int size() override { return 0; }
    int numRowsAffected() override { return 0; }
    QSqlRecord record() const override { return QSqlRecord(); }
};

class XyzDriver : public QSqlDriver
{
public:
    XyzDriver() {}
    ~XyzDriver() {}

    bool hasFeature(DriverFeature /* feature */) const override { return false; }
    bool open(const QString & /* db */, const QString & /* user */,
              const QString & /* password */, const QString & /* host */,
              int /* port */, const QString & /* options */) override
        { return false; }
    void close() override {}
    QSqlResult *createResult() const override { return new XyzResult(this); }
};

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.