Spec-Zone.ru › Qt 5.11

Драйверы баз данных SQL

Модуль Qt SQL использует драйверы плагины для связи с различными API баз данных. Поскольку API модуля SQL Qt независим от базы данных, весь код, специфичный для базы данных, содержится в этих драйверах. Qt поставляется с несколькими драйверами, и можно добавить другие. Исходный код драйвера предоставляется и может использоваться в качестве модели для создания собственных драйверов.

Поддерживаемые базы данных

В таблице ниже перечислены драйверы, включенные в Qt:

Имя драйвера DBMS
QDB2 IBM DB2 (версия 7.1 и выше)
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Драйвер Oracle Call Interface
QODBC Open Database Connectivity (ODBC) — Microsoft SQL Server и другие базы данных, совместимые с ODBC
QPSQL PostgreSQL (версии 7.3 и выше)
QSQLITE2 SQLite версия 2
QSQLITE SQLite версия 3
QTDS Sybase Adaptive Server

Примечание: устарел начиная с Qt 4.7

SQLite — это инпроцессная система баз данных с лучшим охватом тестирования и поддержкой на всех платформах. Oracle через OCI, PostgreSQL и MySQL через ODBC или родной драйвер хорошо протестированы на Windows и Linux. Полный объем поддержки других систем зависит от доступности и качества клиентских библиотек.

Примечание: Для построения плагина драйвера вам нужна соответствующая клиентская библиотека для вашей системы управления базами данных (DBMS). Она предоставляет доступ к API, экспонированному DBMS, и обычно поставляется вместе с ней. Большинство установочных программ также позволяют установить «библиотеки разработки», и именно они вам нужны. Эти библиотеки отвечают за низкоуровневое взаимодействие с DBMS.

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

Компиляция драйверов

Скрипт Qt configure пытается автоматически обнаружить доступные клиентские библиотеки на вашем компьютере. Запустите configure -help , чтобы увидеть, какие драйверы можно скомпилировать. Вы должны получить вывод, подобный этому:

[...]

Database options:

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

[...]

Скрипт configure не может обнаружить необходимые библиотеки и файлы заголовков, если они не находятся в стандартных путях, поэтому может потребоваться указать эти пути с помощью параметров командной строки *_INCDIR=, *_LIBDIR=, или *_PREFIX=. Например, если ваши файлы MySQL установлены в /usr/local/mysql (или в C:\mysql в Windows), то передайте следующий параметр для конфигурации: MYSQL_PREFIX=/usr/local/mysql (или MYSQL_PREFIX=C:\mysql для Windows). Подробности для каждого драйвера описаны ниже.

Из-за практических трудностей работы с внешними зависимостями, только плагин SQLite3 поставляется с бинарными сборками Qt. Для возможности добавления дополнительных драйверов в установку Qt без перекомпиляции всего Qt, можно настроить и скомпилировать каталог qtbase/src/plugins/sqldrivers вне каталога полной сборки Qt. Обратите внимание, что нельзя настроить каждый драйвер по отдельности, только все сразу. Однако драйверы можно скомпилировать по отдельности. Если сборка Qt настроена с -prefix, необходимо установить плагины после их компиляции. Например:

cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql
make install

Подробности драйверов

QMYSQL для MySQL 4 и выше

Поддержка хранимых процедур QMYSQL

MySQL 5 вводит поддержку хранимых процедур на уровне SQL, но не имеет API для управления параметрами IN, OUT и INOUT. Поэтому параметры нужно устанавливать и считывать с помощью команд SQL вместо QSqlQuery::bindValue().

Пример хранимой процедуры:

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

Исходный код для доступа к значениям OUT:

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

Примечание: @outval1 и @outval2 являются переменными, локальными для текущего соединения, и не будут затронуты запросами, отправленными с другого хоста или подключения.

Встроенный сервер MySQL

Встроенный сервер MySQL — это замена обычной клиентской библиотеки. С встроенным сервером MySQL сервер MySQL не нужен для использования функциональности MySQL.

Для использования встроенного сервера MySQL просто свяжите плагин Qt с libmysqld вместо libmysqlclient. Это можно сделать, добавив MYSQL_LIBS=-lmysqld в командную строку конфигурации.

Дополнительную информацию об встроенном сервере MySQL см. в документации MySQL, в главе "libmysqld, the Embedded MySQL Server Library".

Как скомпилировать плагин QMYSQL на Unix и macOS

Вам понадобятся заголовочные файлы MySQL, а также общая библиотека libmysqlclient.so. В зависимости от вашей дистрибуции Linux, вам может потребоваться установить пакет, который обычно называется "mysql-devel".

Укажите qmake расположение заголовочных файлов и общих библиотек MySQL (здесь предполагается, что MySQL установлен в /usr/local ) и запустите make:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- MYSQL_PREFIX=/usr/local
make sub-mysql

Как скомпилировать плагин QMYSQL на Windows

Вам нужно получить установочные файлы MySQL. Запустите SETUP.EXE и выберите «Custom Install». Установите модуль «Libs & Include Files». Скомпилируйте плагин следующим образом (здесь предполагается, что MySQL установлен в C:\MySQL):

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- MYSQL_INCDIR=C:/MySQL/include "MYSQL_LIBDIR=C:/MYSQL/MySQL Server <version>/lib/opt"
nmake sub-mysql

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

QOCI для Oracle Call Interface (OCI)

Плагин Qt OCI поддерживает Oracle 9i, 10g и выше. После подключения к серверу Oracle плагин автоматически определит версию базы данных и включит функции соответственно.

Можно подключиться к базе данных Oracle без файла tnsnames.ora. Для этого необходимо передать SID базы данных в драйвер в качестве имени базы данных и указать имя хоста.

Аутентификация пользователя OCI

Плагин Qt OCI поддерживает аутентификацию с использованием внешних учетных данных (OCI_CRED_EXT). Обычно это означает, что сервер базы данных будет использовать аутентификацию пользователя, предоставленную операционной системой, вместо собственного механизма аутентификации.

Оставьте имя пользователя и пароль пустыми при открытии соединения с QSqlDatabase, чтобы использовать аутентификацию с внешними учетными данными.

Поддержка OCI BLOB/LOB

Бинарные большие объекты (BLOB) могут быть считываться и записываться, но следует учитывать, что этот процесс может потребовать много памяти. Для выбора полей LOB следует использовать запрос с только однократным проходом (см. QSqlQuery::setForwardOnly()).

Вставка BLOB должна выполняться либо с помощью подготовленного запроса, где BLOB привязаны к местам удержания, либо с помощью QSqlTableModel, который использует подготовленный запрос для этого внутри.

Как скомпилировать плагин OCI на Unix и macOS

Для Oracle 10g вам потребуются «Пакет Instant Client - Basic» и «Пакет Instant Client - SDK». Для Oracle версии до 10g требуются стандартные клиентские и SDK пакеты Oracle.

Файлы библиотек Oracle, необходимые для компиляции драйвера:

  • libclntsh.so (все версии)
  • libwtc9.so (только Oracle 9)

Укажите qmake путь к заголовочным файлам и общим библиотекам Oracle и запустите make:

Для Oracle версии 9:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- "OCI_INCDIR=$ORACLE_HOME/rdbms/public" OCI_LIBDIR=$ORACLE_HOME/lib "OCI_LIBS=-lclntsh -lwtc9"
make sub-oci

Для Oracle версии 10, мы предполагаем, что вы установили пакеты RPM пакета SDK Instant Client (вам необходимо скорректировать номер версии соответственно):

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib
make sub-oci

Примечание: Если вы используете пакет Oracle Instant Client, вам необходимо установить LD_LIBRARY_PATH при компиляции плагина OCI SQL и при запуске приложения, использующего плагин OCI SQL. Вы можете избежать этой необходимости, установив RPATH и указав все библиотеки для ссылки. Вот пример:

configure OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib -R /usr/lib/oracle/10.1.0.3/client/lib "OCI_LIBS=-lclntsh -lnnz10"
make

Если вы хотите скомпилировать плагин OCI вручную этим методом, процедура выглядит следующим образом:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- OCI_INCDIR=/usr/include/oracle/10.1.0.3/client OCI_LIBDIR=/usr/lib/oracle/10.1.0.3/client/lib "OCI_LIBS=-Wl,-rpath,/usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10"
make sub-oci

Как скомпилировать плагин OCI на Windows

Выбрать опцию «Программист» в установщике Oracle Client с компакт-диска Oracle Client обычно достаточно для компиляции плагина. Для некоторых версий Oracle Client вам также может потребоваться выбрать опцию «Call Interface (OCI)», если она доступна.

Скомпилируйте плагин следующим образом (здесь предполагается, что Oracle Client установлен в C:\oracle):

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- OCI_INCDIR=c:/oracle/oci/include OCI_LIBDIR=c:/oracle/oci/lib/msvc
nmake sub-oci

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

При запуске приложения вам также потребуется добавить путь oci.dll в переменную окружения PATH:

set PATH=%PATH%;c:\oracle\bin

QODBC для Open Database Connectivity (ODBC)

ODBC — это общий интерфейс, который позволяет подключаться к нескольким DBMS с использованием общего интерфейса. Драйвер QODBC позволяет подключаться к менеджеру драйверов ODBC и получать доступ к доступным источникам данных. Обратите внимание, что вам также необходимо установить и настроить драйверы ODBC для менеджера драйверов ODBC, установленного в вашей системе. Плагин QODBC затем позволяет использовать эти источники данных в ваших приложениях Qt.

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

В Windows менеджер драйверов ODBC должен быть установлен по умолчанию. Для Unix-систем существуют некоторые реализации, которые необходимо установить предварительно. Обратите внимание, что каждый конечный пользователь вашего приложения должен иметь установленный менеджер драйверов ODBC, иначе плагин QODBC не будет работать.

При подключении к источнику данных ODBC вы должны передать имя источника данных ODBC в функцию QSqlDatabase::setDatabaseName(), а не фактическое имя базы данных.

Плагину QODBC нужен менеджер драйверов ODBC версии 2.0 или выше, совместимый с ODBC. Некоторые драйверы ODBC заявляют о совместимости с версией 2.0, но не предоставляют всей необходимой функциональности. Поэтому плагин QODBC проверяет, можно ли использовать источник данных после установления подключения, и отказывается работать, если проверка завершается неудачно. Если вам не нравится это поведение, вы можете удалить строку #define ODBC_CHECK_DRIVER из файла qsql_odbc.cpp. Делайте это на свой страх и риск!

END_OF_DOCUMENT_MARKER

По умолчанию Qt сообщает драйверу ODBC, что он должен вести себя как драйвер ODBC 2.x. Однако для некоторых сочетаний драйвер-менеджер/ODBC 3.x-драйвер (например, unixODBC/MaxDB ODBC), указание драйверу ODBC вести себя как драйвер 2.x может привести к неожиданному поведению плагина драйвера. Чтобы избежать этой проблемы, укажите драйверу ODBC вести себя как драйвер 3.x, установив соответствующий параметр подключения "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3" перед открытием соединения с базой данных. Обратите внимание, что это повлияет на множество аспектов поведения драйвера ODBC, например, на SQLSTATE. Перед установкой этого параметра подключения, проконсультируйтесь с документацией вашего ODBC драйвера о возможных различиях в поведении.

При использовании базы данных SAP HANA соединение должно быть установлено с параметром «SCROLLABLERESULT=TRUE», так как драйвер HANA ODBC по умолчанию не предоставляет прокручиваемые результаты, например:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
QString connectString = QStringLiteral(
    "DRIVER=/path/to/installation/libodbcHDB.so;"
    "SERVERNODE=hostname:port;"
    "UID=USER;"
    "PWD=PASSWORD;"
    "SCROLLABLERESULT=true");
db.setDatabaseName(connectString);

Если вы столкнулись с очень медленным доступом к источнику данных ODBC, убедитесь, что отслеживание вызовов ODBC выключено в диспетчере источников данных ODBC.

Некоторые драйверы не поддерживают прокручиваемые курсоры. В этом случае можно успешно использовать только запросы в режиме forwardOnly.

Поддержка хранимых процедур ODBC

В Microsoft SQL Server набор результатов, возвращаемый хранимой процедурой, использующей оператор return или возвращающей несколько наборов результатов, будет доступен только в том случае, если вы установите режим запроса forwardOnly в значение forward, используя QSqlQuery::setForwardOnly().

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

Примечание: Значение, возвращаемое оператором return хранимой процедуры, отбрасывается.

Поддержка ODBC Unicode

Плагин QODBC будет использовать API Unicode, если определено UNICODE. В системах Windows NT это значение по умолчанию. Обратите внимание, что драйвер ODBC и СУБД также должны поддерживать Unicode.

Некоторые менеджеры драйверов и драйверы не поддерживают UNICODE. Чтобы использовать плагин QODBC с такими драйверами, он должен быть скомпилирован с определенным Q_ODBC_VERSION_2.

Для драйвера Oracle 9 ODBC (Windows) необходимо проверить поддержку «SQL_WCHAR» в менеджере драйверов ODBC, иначе Oracle преобразует все строковые значения Unicode в локальные 8-битные.

Как скомпилировать плагин ODBC в Unix и macOS

Рекомендуется использовать unixODBC. Вы можете найти последнюю версию и драйверы ODBC по адресу http://www.unixodbc.org. Вам потребуются заголовочные файлы и общие библиотеки unixODBC.

Укажите qmake, где находятся заголовочные файлы и общие библиотеки unixODBC (здесь предполагается, что unixODBC установлен в /usr/local/unixODBC) и выполните make:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- ODBC_PREFIX=/usr/local/unixODBC
make sub-odbc

Как скомпилировать плагин ODBC в Windows

Заголовочные и включаемые файлы ODBC должны быть уже установлены в соответствующих каталогах. Вам просто нужно скомпилировать плагин следующим образом:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake
nmake sub-odbc

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

QPSQL для PostgreSQL (Версия 7.3 и выше)

Драйвер QPSQL поддерживает версию 7.3 и выше сервера PostgreSQL.

Дополнительную информацию о PostgreSQL вы найдете по адресу http://www.postgresql.org.

Поддержка QPSQL Unicode

Драйвер QPSQL автоматически определяет, поддерживает ли база данных PostgreSQL, к которой вы подключаетесь, Unicode или нет. Unicode автоматически используется, если сервер его поддерживает. Обратите внимание, что драйвер поддерживает только кодировку UTF-8. Если ваша база данных использует другую кодировку, сервер должен быть скомпилирован с поддержкой преобразования Unicode.

Поддержка Unicode была добавлена в PostgreSQL версии 7.1, и она будет работать только в том случае, если сервер и библиотека клиента были скомпилированы с поддержкой многобайтных символов. Более подробную информацию о настройке многобайтного сервера PostgreSQL можно найти в руководстве администратора PostgreSQL, глава 5.

Поддержка QPSQL BLOB

Бинарные большие объекты поддерживаются типом поля BYTEA в серверах PostgreSQL версий >= 7.1.

Поддержка QPSQL запросов только для перехода вперед

Чтобы использовать запросы только для перехода вперед, вы должны скомпилировать плагин QPSQL с клиентской библиотекой PostreSQL версии 9.2 или более поздней. Если плагин скомпилирован с более ранней версией, режим forward-only будет недоступен — вызов QSqlQuery::setForwardOnly() со значением true не будет иметь эффекта.

Предупреждение: Если вы скомпилируете плагин QPSQL с PostgreSQL версии 9.2 или более поздней, вы должны распространять ваше приложение с libpq версии 9.2 или более поздней. В противном случае загрузка плагина QPSQL завершится ошибкой с сообщением:

QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
Could not create database object

Во время навигации по результатам в режиме forward-only дескриптор QSqlResult может измениться. Приложения, использующие низкоуровневый дескриптор SQL-результата, должны получать новый дескриптор после каждого вызова любой из функций извлечения QSqlResult. Пример:

QSqlQuery query(db);
query.setForwardOnly(true);
query.exec("SELECT * FROM table");
while (query.next()) {
    // Handle changes in every iteration of the loop
    QVariant v = query.result()->handle();
    if (qstrcmp(v.typeName(), "PGresult*") == 0) {
        PGresult *handle = *static_cast<PGresult **>(v.data());
        if (handle != 0) {
            // Do something...
        }
    }
}

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

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

Эта проблема не возникнет, если запросы query1 и query2 используют разные подключения к базе данных или если запрос query2 выполняется после цикла while.

Примечание: Некоторые методы QSqlDatabase, такие как tables(), primaryIndex(), неявным образом выполняют SQL-запросы, поэтому их также нельзя использовать во время навигации по результатам запроса только для перехода вперед.

Примечание: QPSQL выведет следующее предупреждение, если обнаружит потерю результатов запроса:

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

Как скомпилировать плагин QPSQL в Unix и macOS

Вам нужна клиентская библиотека и заголовочные файлы PostgreSQL.

Для того, чтобы qmake обнаружил заголовочные файлы и общие библиотеки PostgreSQL, выполните qmake следующим образом (предполагая, что клиент PostgreSQL установлен в /usr):

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- PSQL_INCDIR=/usr/include/pgsql
make sub-psql

Как скомпилировать плагин QPSQL в Windows

Установите соответствующие библиотеки разработчика PostgreSQL для вашего компилятора. Предполагая, что PostgreSQL установлен в C:\psql, скомпилируйте плагин следующим образом:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- PSQL_INCDIR=C:/psql/include PSQL_LIBDIR=C:/psql/lib/ms
nmake sub-psql

Пользователи MinGW могут обратиться к следующему онлайн-документу: PostgreSQL MinGW/Native Windows.

QTDS для Sybase Adaptive Server

Примечание: TDS больше не используется MS Sql Server и заменен на ODBC. QTDS устарел начиная с Qt 4.7.

Невозможно установить порт с помощью QSqlDatabase::setPort() из-за ограничений в библиотеке клиента Sybase. Обратитесь к документации Sybase за информацией о том, как настроить конфигурационный файл клиента Sybase для подключения к базам данных на нестандартных портах.

Как скомпилировать плагин QTDS в Unix и macOS

В Unix доступны две библиотеки, поддерживающие протокол TDS:

  • FreeTDS, бесплатная реализация протокола TDS (http://www.freetds.org).
  • Sybase Open Client, доступен по адресу https://support.sap.com.

Независимо от используемой библиотеки, необходим общий объектный файл libsybdb.so. Установите переменную среды SYBASE для указания каталога, в котором установлена клиентская библиотека, и выполните qmake:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- TDS_PREFIX=$SYBASE
make sub-tds

Как скомпилировать плагин QDTS в Windows

Вы можете использовать либо библиотеку DB-Library, предоставленную Microsoft, либо Sybase Open Client (https://support.sap.com). Configure будет пытаться найти NTWDBLIB.LIB для компиляции плагина:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake
nmake sub-tds

По умолчанию в Windows используется библиотека Microsoft. Если вы хотите принудительно использовать Sybase Open Client, вы должны определить Q_USE_SYBASE в %QTDIR%\qtbase\src\plugins\sqldrivers\tds\qsql_tds.cpp.

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

QDB2 для IBM DB2 (Версия 7.1 и выше)

Плагин Qt DB2 позволяет получить доступ к базам данных IBM DB2. Он был протестирован с IBM DB2 v7.1 и 7.2. Вы должны установить клиентскую библиотеку разработки IBM DB2, которая содержит заголовочные и библиотечные файлы, необходимые для компиляции плагина QDB2.

Драйвер QDB2 поддерживает подготовленные запросы, чтение/запись строк Unicode и чтение/запись BLOB.

Рекомендуется использовать запрос только для перехода вперед при вызове хранимых процедур в DB2 (см. QSqlQuery::setForwardOnly()).

Как скомпилировать плагин QDB2 в Unix и macOS

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- DB2_PREFIX=$DB2DIR
make sub-db2

Как скомпилировать плагин QDB2 в Windows

Файлы заголовков и включения DB2 должны быть установлены в соответствующих каталогах. Вам просто нужно скомпилировать плагин следующим образом:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- "DB2_PREFIX=<DB2 home>/sqllib"
nmake sub-db2

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

QSQLITE2 для SQLite Версия 2

Плагин Qt SQLite 2 предлагается для совместимости. Всякий раз, когда это возможно, используйте плагин версии 3 вместо него. Инструкции по сборке версии 3 также применимы к версии 2.

QSQLITE для SQLite (Версия 3 и выше)

Плагин Qt SQLite позволяет получить доступ к базам данных SQLite. SQLite — это база данных в процессе, что означает, что для неё не требуется сервер базы данных. SQLite работает с одним файлом, который должен быть задан в качестве имени базы данных при открытии соединения. Если файла не существует, SQLite попытается его создать. SQLite также поддерживает базы данных в памяти и временные базы данных. Просто передайте соответственно ":memory:" или пустую строку в качестве имени базы данных.

SQLite имеет некоторые ограничения по поводу нескольких пользователей и нескольких транзакций. Если вы попытаетесь читать/записывать на ресурс из разных транзакций, ваше приложение может зависнуть до тех пор, пока одна транзакция не будет завершена или отменена. Драйвер SQLite Qt будет повторно пытаться записать в заблокированный ресурс, пока не достигнет таймаута (см. QSQLITE_BUSY_TIMEOUT в QSqlDatabase::setConnectOptions()).

В SQLite любой столбец, за исключением столбца INTEGER PRIMARY KEY, может использоваться для хранения любого типа значения. Например, столбец, объявленный как INTEGER, может содержать целое значение в одной строке и текстовое значение в следующей. Это происходит из-за того, что SQLite связывает тип значения со значением, а не со столбцом, в котором оно хранится. Следствием этого является то, что тип, возвращаемый QSqlField::type(), указывает только рекомендуемый тип поля. Не следует делать предположений о фактическом типе на основе этого, и необходимо проверять тип отдельных значений.

Драйвер заблокирован для обновлений во время выполнения запроса select. Это может привести к проблемам при использовании QSqlTableModel, поскольку виджеты элементов Qt извлекают данные по мере необходимости (с помощью QSqlQuery::fetchMore() в случае QSqlTableModel).

Вы можете найти информацию о SQLite на http://www.sqlite.org.

Как скомпилировать плагин QSQLITE

SQLite версия 3 включена в качестве сторонней библиотеки в Qt. Ее можно скомпилировать, передав параметр -qt-sqlite скрипту конфигурации.

Если вы не хотите использовать библиотеку SQLite, включенную в Qt, вы можете передать -system-sqlite скрипту конфигурации, чтобы использовать библиотеки SQLite операционной системы. Это рекомендуется, когда это возможно, так как это уменьшает размер установки и удаляет один компонент, для которого вам нужно отслеживать рекомендации по безопасности.

В Unix и macOS (замените $SQLITE на каталог, где находится SQLite):

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- -system-sqlite SQLITE3_PREFIX=$SQLITE
make sub-sqlite

В Windows:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- -system-sqlite SQLITE3_PREFIX=C:/SQLITE
nmake sub-sqlite

Включить оператор REGEXP

SQLite поставляется с операцией REGEXP. Однако необходимое реализацию должен предоставить пользователь. Для удобства можно включить стандартную реализацию, установив параметр подключения QSQLITE_ENABLE_REGEXP перед открытием подключения к базе данных. Затем оператор SQL, такой как "column REGEXP 'pattern'", по существу расширяется до кода Qt

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

Для повышения производительности регулярные выражения кэшируются внутри. По умолчанию размер кэша равен 25, но его можно изменить, изменив значение параметра. Например, передача "QSQLITE_ENABLE_REGEXP=10" уменьшит размер кэша до 10.

Совместимость формата файла QSQLITE

SQLite незначительные релизы иногда нарушают совместимость формата файлов. Например, SQLite 3.3 может читать файлы баз данных, созданные с SQLite 3.2, но базы данных, созданные с SQLite 3.3, не могут быть прочитаны SQLite 3.2. Обратитесь к документации SQLite и журналам изменений для получения информации о совместимости форматов файлов между версиями.

Незначительные релизы Qt обычно следуют незначительным релизам SQLite, в то время как исправления Qt следуют за исправлениями SQLite. Исправления совместимы как назад, так и вперед.

Чтобы принудительно заставить SQLite использовать определенный формат файла, необходимо скомпилировать и отправить свой собственный плагин базы данных со своей собственной библиотекой SQLite, как показано выше. Некоторые версии SQLite можно принудительно заставить записывать определенный формат файла, установив определение SQLITE_DEFAULT_FILE_FORMAT при компиляции SQLite.

QIBASE для Borland InterBase

Плагин Qt InterBase позволяет получить доступ к базам данных InterBase и Firebird. InterBase может использоваться как клиент/сервер или без сервера, в этом случае он работает с локальными файлами. Файл базы данных должен существовать перед установлением соединения.

Обратите внимание, что InterBase требует указания полного пути к файлу базы данных, независимо от того, хранится ли он локально или на другом сервере.

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

Для компиляции этого плагина необходимы заголовки и библиотеки InterBase/Firebird.

Из-за несовместимости лицензий с GPL пользователям Qt Open Source Edition запрещено связывать этот плагин с коммерческими изданиями InterBase. Используйте Firebird или бесплатную версию InterBase.

Поддержка Unicode QIBASE и кодировка текста

По умолчанию драйвер подключается к базе данных, используя UNICODE_FSS. Это можно изменить, установив параметр ISC_DPB_LC_CTYPE с помощью QSqlDatabase::setConnectOptions() перед открытием подключения.

// connect to database using the Latin-1 character set
db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1");
db.open();

Если Qt не поддерживает заданную кодировку текста, драйвер выведет сообщение об ошибке и подключится к базе данных, используя UNICODE_FSS.

Обратите внимание, что если кодировка текста, установленная при подключении к базе данных, отличается от кодировки в базе данных, могут возникнуть проблемы с транслитерацией.

Хранимые процедуры QIBASE

InterBase/Firebird возвращают значения OUT в качестве набора результатов, поэтому при вызове хранимых процедур необходимо связывать только значения IN через QSqlQuery::bindValue(). Значения RETURN/OUT можно извлечь с помощью QSqlQuery::value(). Пример:

QSqlQuery q;
q.exec("execute procedure my_procedure");
q.next();
qDebug() << q.value(0); // outputs the first RETURN/OUT value

Как скомпилировать плагин QIBASE в Unix и macOS

Предполагается, что InterBase или Firebird установлены в /opt/interbase:

Если вы используете InterBase:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- IBASE_PREFIX=/opt/interbase
make sub-ibase

Если вы используете Firebird, библиотеку Firebird необходимо установить явно:

cd $QTDIR/qtbase/src/plugins/sqldrivers
qmake -- IBASE_PREFIX=/opt/interbase IBASE_LIBS=-lfbclient
make sub-ibase

Как скомпилировать плагин QIBASE в Windows

Предполагается, что InterBase или Firebird установлены в C:\interbase:

Если вы используете InterBase:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- IBASE_INCDIR=C:/interbase/include
nmake sub-ibase

Если вы используете Firebird, библиотеку Firebird необходимо установить явно:

cd %QTDIR%\qtbase\src\plugins\sqldrivers
qmake -- IBASE_INCDIR=C:/interbase/include IBASE_LIBS=-lfbclient
nmake sub-ibase

Если вы не используете компилятор Microsoft, замените nmake на mingw32-make в строке выше.

Обратите внимание, что C:\interbase\bin должен находиться в PATH.

Устранение неполадок

Всегда следует использовать библиотеки клиентов, которые были скомпилированы с тем же компилятором, что и ваш проект. Если вы не можете получить исходное распределение для самостоятельной компиляции библиотек клиентов, убедитесь, что предварительно скомпилированная библиотека совместима с вашим компилятором, в противном случае у вас будет много ошибок «неопределённых символов». Некоторые компиляторы имеют инструменты для преобразования библиотек, например, Borland поставляет инструмент COFF2OMF.EXE для преобразования библиотек, сгенерированных с помощью Microsoft Visual C++.

Если компиляция плагина проходит успешно, но его нельзя загрузить, убедитесь, что выполнены следующие требования:

  • Убедитесь, что плагин находится в правильном каталоге. Вы можете использовать QApplication::libraryPaths() для определения того, где Qt ищет плагины.
  • Убедитесь, что библиотеки клиентов DBMS доступны в системе. В Unix выполните команду ldd и передайте имя плагина в качестве параметра, например ldd libqsqlmysql.so. Вы получите сообщение об ошибке, если какая-либо из библиотек клиентов не найдена. В Windows вы можете использовать средство проверки зависимостей Visual Studio. В Qt Creator вы можете обновить переменную среды PATH в разделе Запуск панели Проект, чтобы включить путь к папке, содержащей библиотеки клиентов.
  • Скомпилируйте Qt с определенным QT_DEBUG_COMPONENT для получения очень подробных отладочных сообщений при загрузке плагинов.

Убедитесь, что вы выполнили руководство по развёртыванию плагинов.

Как написать свой собственный драйвер базы данных

QSqlDatabase отвечает за загрузку и управление плагинами драйверов баз данных. При добавлении базы данных (см. QSqlDatabase::addDatabase()), загружается соответствующий плагин драйвера (с помощью QSqlDriverPlugin). QSqlDatabase полагается на плагин драйвера для предоставления интерфейсов для QSqlDriver и QSqlResult.

QSqlDriver — это абстрактный базовый класс, который определяет функциональность драйвера базы данных SQL. В него входят функции, такие как QSqlDriver::open() и QSqlDriver::close(). QSqlDriver отвечает за подключение к базе данных, создание соответствующей среды и т. д. Кроме того, QSqlDriver может создавать объекты QSqlQuery, подходящие для конкретного API базы данных. QSqlDatabase перенаправляет многие вызовы функций непосредственно в QSqlDriver, который предоставляет конкретную реализацию.

QSqlResult — это абстрактный базовый класс, который определяет функциональность запроса базы данных SQL. В него входят такие операторы, как SELECT, UPDATE, и ALTER TABLE. QSqlResult содержит функции, такие как QSqlResult::next() и QSqlResult::value(). QSqlResult отвечает за отправку запросов в базу данных, возврат данных результатов и т. д. QSqlQuery перенаправляет многие вызовы функций непосредственно в QSqlResult, который предоставляет конкретную реализацию.

QSqlDriver и QSqlResult тесно связаны. При реализации драйвера Qt SQL оба этих класса должны быть расширены, и абстрактные виртуальные методы в каждом классе должны быть реализованы.

Чтобы реализовать драйвер Qt SQL в виде плагина (чтобы он распознавался и загружался библиотекой Qt во время выполнения), драйвер должен использовать макрос Q_PLUGIN_METADATA(). Читайте Как создать плагины Qt для получения дополнительной информации об этом. Вы также можете ознакомиться с тем, как это делается в плагинах SQL, которые поставляются с Qt в QTDIR/qtbase/src/plugins/sqldrivers.

Следующий код может быть использован в качестве шаблона для драйвера 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() {}
    QSqlResult *createResult() const override { return new XyzResult(this); }
};

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/sql-driver.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API