Драйверы баз данных 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. Делайте это на свой страх и риск!
По умолчанию 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