Драйверы баз данных 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