Spec-Zone.ru › Qt 5.9

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

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

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

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

Имя драйвера Система управления базами данных (СУБД)
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. Полный характер поддержки других систем зависит от наличия и качества библиотек клиентов.

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

Примечание: При использовании 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, библиотека встроенного сервера MySQL".

Как скомпилировать плагин 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 Package — Basic» и «Instant Client Package — SDK». Для Oracle версии до 10g требуется стандартный клиент Oracle и пакеты SDK.

Файлы библиотек 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 для Instant Client Package SDK (вам нужно соответствующим образом скорректировать номер версии):

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 также может потребоваться выбрать опцию «Интерфейс вызовов (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 — это общий интерфейс, который позволяет подключаться к нескольким СУБД, используя общий интерфейс. Драйвер QODBC позволяет подключаться к диспетчеру драйверов ODBC и получать доступ к доступным источникам данных. Обратите внимание, что вам также необходимо установить и настроить драйверы ODBC для диспетчера драйверов ODBC, установленного на вашей системе. Плагин QODBC затем позволяет использовать эти источники данных в ваших приложениях Qt.

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

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

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

Плагину QODBC нужен диспетчер драйверов ODBC версии 2.0 или новее. Некоторые драйверы 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 о возможных различиях в поведении.

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

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

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

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

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

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

Поддержка 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
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.

Поддержка 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
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.

Мы рекомендуем использовать запрос forward-only при вызове хранимых процедур в 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 имеет некоторые ограничения относительно нескольких пользователей и нескольких транзакций. Если вы пытаетесь читать/записывать в ресурс из разных транзакций, ваше приложение может зависнуть, пока одна транзакция не будет подтверждена или отменена. Драйвер Qt SQLite будет повторно пытаться записать в заблокированный ресурс до тех пор, пока не истечет время ожидания (см. 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

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

Поддержка Юникода и кодировка текста 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 Dependency Walker. В 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 */) { 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/qt-5.9/sql-driver.html

Spec-Zone.ru

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