Spec-Zone.ru › Qt 5.6

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

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

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

В таблице ниже перечислены драйверы, включенные в Qt. Из-за несовместимости лицензий с GPL не все плагины предоставляются в версиях 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, а также PostreSQL и MySQL через ODBC или родной драйвер хорошо протестированы в Windows и Linux. Полный объем поддержки других систем зависит от наличия и качества клиентских библиотек.

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

Компиляция драйверов с помощью configure

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

-no-sql-<driver> ... Disable SQL <driver> entirely.
-qt-sql-<driver> ... Enable a SQL <driver> in the Qt Library, by default
                     none are turned on.
-plugin-sql-<driver> Enable SQL <driver> as a plugin to be linked to
                     at run time.

                     Possible values for <driver>:
                     [ db2 ibase mysql oci odbc psql sqlite sqlite2 tds ]

Скрипт configure не может определить необходимые библиотеки и файлы заголовков, если они не находятся в стандартных путях, поэтому может потребоваться указать эти пути с помощью параметров командной строки -I и -L. Например, если ваши файлы заголовков MySQL установлены в /usr/local/mysql (или в C:\mysql\include в Windows), то передайте следующий параметр configure: -I/usr/local/mysql (или -I C:\mysql\include для Windows).

В Windows параметр -I не принимает пробелы в именах файлов, поэтому используйте имя в формате 8.3; например, используйте C:\progra~1\mysql вместо C:\Program Files\mysql.

Используйте параметр -qt-sql-<driver> для статической компиляции драйвера базы данных в вашу библиотеку Qt или -plugin-sql-<driver> для компиляции драйвера как плагина. Дополнительную информацию о необходимых библиотеках см. в следующих разделах.

Ручная компиляция плагинов

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. Это можно сделать, заменив -lmysqlclient_r на -lmysqld в команде qmake в разделе ниже.

Дополнительную информацию об встроенном сервере MySQL см. в документации MySQL, глава «libmysqld, библиотека встроенного сервера MySQL».

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

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

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql
qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
make

После установки Qt вам также нужно установить плагин в стандартное местоположение:

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

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\mysql
qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MYSQL/MySQL Server <version>/lib/opt/libmysql.lib" mysql.pro
nmake

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

Примечание: Этот плагин базы данных не поддерживается в Windows CE.

Примечание: Включение "-o Makefile" в качестве аргумента qmake для указания места сборки файла make может привести к тому, что плагин будет скомпилирован только в режиме релиз. Если вам нужен также отладочный вариант, не используйте опцию "-o Makefile".

QOCI для Oracle Call Interface (OCI)

Общая информация о плагине OCI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
qmake "INCLUDEPATH+=$ORACLE_HOME/rdbms/public $ORACLE_HOME/rdbms/demo" "LIBS+=-L$ORACLE_HOME/lib -lclntsh -lwtc9" oci.pro
make

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client/" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -lclntsh" oci.pro
make

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

configure -I /usr/include/oracle/10.1.0.3/client -L /usr/lib/oracle/10.1.0.3/client/lib -R /usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10
make

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/oci
qmake "INCLUDEPATH+=/usr/include/oracle/10.1.0.3/client" "LIBS+=-L/usr/lib/oracle/10.1.0.3/client/lib -Wl,-rpath,/usr/lib/oracle/10.1.0.3/client/lib -lclntsh -lnnz10" oci.pro
make

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

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

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

set INCLUDE=%INCLUDE%;c:\oracle\oci\include
set LIB=%LIB%;c:\oracle\oci\lib\msvc
cd %QTDIR%\qtbase\src\plugins\sqldrivers\oci
qmake oci.pro
nmake

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

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

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

Примечание: Этот плагин базы данных не поддерживается в Windows CE.

QODBC для Open Database Connectivity (ODBC)

Общая информация о плагине 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. Делайте это на свой страх и риск!

По умолчанию 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 о возможных различиях в поведении.

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

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

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

В Microsoft SQL Server набор результатов, возвращаемый хранимой процедурой, использующей оператор return или возвращающей несколько наборов результатов, будет доступен только в том случае, если вы установите режим forward только запроса в значение 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 хранимой процедуры, игнорируется.

Поддержка Unicode ODBC

Плагин 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/odbc
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
make

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\odbc
qmake odbc.pro
nmake

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

Примечание: Этот плагин базы данных не поддерживается официально для Windows CE.

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

Общая информация о драйвере QPSQL

Драйвер QPSQL поддерживает версию 7.3 и выше сервера PostgreSQL. Мы рекомендуем использовать клиентскую библиотеку с версии 7.3.15, 7.4.13, 8.0.8, 8.1.4 или более новой, так как эти версии содержат исправления безопасности, и драйвер QPSQL может не скомпилироваться со старыми версиями клиентской библиотеки в зависимости от вашей платформы.

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

Поддержка Unicode QPSQL

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

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

Поддержка BLOB QPSQL

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

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

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

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/psql
qmake "INCLUDEPATH+=/usr/include/pgsql" "LIBS+=-L/usr/lib -lpq" psql.pro
make

После установки Qt, вам также необходимо установить плагин в стандартном месте:

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

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\psql
qmake "INCLUDEPATH+=C:/psql/include" "LIBS+=C:/psql/lib/ms/libpq.lib" psql.pro
nmake

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

Примечание: Этот плагин базы данных не поддерживается для Windows CE.

QTDS для Sybase Adaptive Server

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

Общая информация о QTDS

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

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

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

  • FreeTDS, бесплатная реализация протокола TDS (http://www.freetds.org). Обратите внимание, что FreeTDS ещё не стабилен, поэтому некоторые функции могут не работать как ожидается.
  • Sybase Open Client, доступный по адресу http://www.sybase.com. Для пользователей Linux: Получите RPM Open Client с http://linux.sybase.com.

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/tds
qmake "INCLUDEPATH=$SYBASE/include" "LIBS=-L$SYBASE/lib -lsybdb"
make

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\tds
qmake "LIBS+=NTWDBLIB.LIB" tds.pro
nmake

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

Примечание: Этот плагин базы данных не поддерживается для Windows CE.

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

Общая информация о QDB2

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

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

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

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/db2
qmake "INCLUDEPATH+=$DB2DIR/include" "LIBS+=-L$DB2DIR/lib -ldb2"
make

После установки Qt, вам также необходимо установить плагин в стандартном месте:

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

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\db2
qmake "INCLUDEPATH+=<DB2 home>/sqllib/include" "LIBS+=<DB2 home>/sqllib/lib/db2cli.lib"
nmake

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

Примечание: Этот плагин базы данных не поддерживается для Windows CE.

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

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

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

Общая информация о QSQLITE

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

SQLite имеет некоторые ограничения в отношении нескольких пользователей и нескольких транзакций. Если вы попытаетесь прочитать/записать ресурс из разных транзакций, ваше приложение может зависнуть до тех пор, пока одна транзакция не подтвердит или не откажет.

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

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

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

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

SQLite версии 3 включена как сторонняя библиотека в Qt. Она может быть скомпилирована, передав следующие параметры в скрипт конфигурации: -plugin-sql-sqlite (сборка как плагин) или -qt-sql-sqlite (прямая компоновка в библиотеку Qt).

Если вы не хотите использовать библиотеку SQLite, включенную в Qt, вы можете передать -system-sqlite скрипту конфигурации, чтобы использовать библиотеки sqlite в операционной системе. В качестве альтернативы, вы можете собрать её вручную (замените $SQLITE на каталог, где находится SQLite):

cd $QTDIR/qtbase/src/plugins/sqldrivers/sqlite
qmake "INCLUDEPATH+=$SQLITE/include" "LIBS+=-L$SQLITE/lib -lsqlite"
make

После установки Qt вам также необходимо установить плагин в стандартном расположении:

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

В Windows:

cd %QTDIR%\qtbase\src\plugins\sqldrivers\sqlite
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
nmake

Совместимость формата файлов 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

Общая информация о QIBASE

Плагин 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/ibase
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib" ibase.pro
make

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

cd $QTDIR/qtbase/src/plugins/sqldrivers/ibase
qmake "INCLUDEPATH+=/opt/interbase/include" "LIBS+=-L/opt/interbase/lib -lfbclient" ibase.pro
make

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

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

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\ibase
qmake "INCLUDEPATH+=C:/interbase/include" ibase.pro
nmake

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

cd %QTDIR%\qtbase\src\plugins\sqldrivers\ibase
qmake "INCLUDEPATH+=C:/interbase/include" "LIBS+=-lfbclient" ibase.pro
nmake

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

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

Примечание: Этот плагин базы данных не поддерживается для Windows CE.

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

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

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

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

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

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QMYSQL

проблема обычно заключается в том, что у плагина был неправильный ключ сборки. Это может потребовать удаления записи из кэша плагинов.

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

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 и QTDIR/qtbase/src/sql/drivers.

Следующий код можно использовать в качестве шаблона для SQL-драйвера:

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

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

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

    bool hasFeature(DriverFeature /* feature */) const { return false; }
    bool open(const QString & /* db */, const QString & /* user */,
              const QString & /* password */, const QString & /* host */,
              int /* port */, const QString & /* options */)
        { return false; }
    void close() {}
    QSqlResult *createResult() const { 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.6/sql-driver.html

Spec-Zone.ru

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