Пример программы qt mysql. Разработка Qt-приложения с доступом к MySQL под Android. Как собрать QDB2 плагин под Unix и Mac OS X

Общее описание

Жидкокристаллический модуль MT–16S2H состоит из БИС контроллера управления и ЖК панели. Контроллер управления КБ1013ВГ6, производства ОАО «АНГСТРЕМ» (www.angstrem.ru), аналогичен HD44780 фирмы HITACHI и KS0066 фирмы SAMSUNG.

Модуль выпускается со светодиодной подсветкой . Внешний вид приведен на рисунке 1. Модуль позволяет отображать 1 строку из 16 символов. Символы отображаются в матрице 5х8 точек. Между символами имеются интервалы шириной в одну отображаемую точку.

Каждому отображаемому на ЖКИ символу соответствует его код в ячейке ОЗУ модуля.

Модуль содержит два вида памяти - кодов отображаемых символов и пользовательского знакогенератора, а также логику для управления ЖК панелью.

Габаритные размеры модуля приведены на рисунке 7.

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

Модуль позволяет:

  • модуль имеет программно-переключаемые две страницы встроенного знакогенератора (алфавиты: русский, украинский, белорусский, казахский и английский; см. табл. 5 и 6).
  • работать как по 8-ми, так и по 4-х битной шине данных (задается при инициализации);
  • принимать команды с шины данных (перечень команд приведен в таблице 4);
  • записывать данные в ОЗУ с шины данных;
  • читать данные из ОЗУ на шину данных;
  • читать статус состояния на шину данных (см. табл. 4);
  • запоминать до 8-ми изображений символов, задаваемых пользователем;
  • выводить мигающий (или не мигающий) курсор двух типов;
  • управлять контрастностью и подсветкой;

Основные сведения

Модуль управляется по параллельному 4-х или 8-ми битному интерфейсу.

Временные диаграммы приведены на рис. 3 и 4, динамические характеристики приведены в таблице 2.

Примеры обмена по интерфейсу приведены на рис. 5 и 6.

Программное управление осуществляется с помощью системы команд, приведенной в таблице 4.

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

Встроенный знакогенератор приведен в таблицах 5 и 6.

Модуль позволяет задать изображения восьми дополнительных символов знакогенератора, использующихся при работе наравне со встроенными. Пример задания дополнительных символов приведен в таблице 3.

Таблица 1. Динамические характеристики модуля

Название Обозначение U cc =5B U cc =3B Единицы измерения
Мин. Макс. Мин. Макс.
Время цикла чтения/записи t cycE 500 - 1000 - ns
Длительность импульса разрешения чтения/записи PW EH 230 - 450 - ns
Время нарастания и спада t Er , t Ef - 20 - 25 ns
Время предустановки адреса t AS 40 - 60 - ns
Время удержания адреса t AH 10 - 20 - ns
Время выдачи данных t DDR - 120 - 360 ns
Время задержки данных t DHR 5 - 5 - ns
Время предустановки данных t DSW 80 - 195 - ns
Время удержания данных t H 10 - 10 - ns

Управление контрастностью

При напряжении питания модуля 3В контрастность на заводе-изготовителе установлена на максимум. Уменьшение контрастности производится подключением между выводами U o и GND внешнего резистора номиналом до 3 кОм.

При напряжении питания модуля 5В контрастность модуля зависит от напряжения питания ЖК панели (U LCD) и температуры. Управление контрастностью производится внешним резистором (рис. 2). При поставке модуля контрастность настроена на U cc =5B, поэтому при напряжении питания модуля 5В, контакт 3(U o) необходимо объединить с контактом 1(GND). При температурах ниже 0°С регулировка контрастности необходима.


Рис. 2

Характеристики модуля по постоянному току

Таблица 2. Характеристики модуля по постоянному току

Название Обозначение U cc =5B U cc =3B Единицы измерения
Мин. Ном. Макс. Мин. Ном. Макс.
Напряжение питания логическое U CC –GND 4,5 5,0 5,5 2,7 3,0 3,3 В
ЖКИ U CC –U o 4,8 5,0 5,2 - - - В
Ток потребления I CC - 0,8 1,0 - 0,8 1,0 мА
Входное напряжение высокого уровня при I IH =0,1мА U IH 2,2 - U CC 2,2 - U CC В
Входное напряжение низкого уровня при I IL =0,1мА U IL –0,3 - 0,6 -0,3 - 0,4 В
Выходное напряжение высокого уровня при I OH =0,2мА U OH 2,4 - - 2,0 - - В
Выходное напряжение низкого уровня при I OL =1,2мА U OL - - 0,4 - - 0,4 В
Ток подсветки при напряжении питания подсветки =U cc (для янтарной и желто-зеленой подсветки) I LED - - 120 - - 80 мА

Временные диаграммы


Рис. 3. Диаграмма чтения


Рис. 4. Диаграмма записи


Рис. 5

Примечание. В каждом цикле обмена необходимо передавать (читать или писать) все 8 бит - два раза по 4 бита. Передача старших 4-х бит без последующей передачи младших 4-х бит не допускается.


Рис. 6

Начальная установка модуля

Модуль войдет в нормальный режим работы только после подачи на него следующих команд:

Примечание. Назначение битов указано в таблице 4. После этих действий модуль переходит в рабочее состояние с установленными параметрами.

Модуль содержит ОЗУ размером 80 байтов по адресам 0h–27h и 40h–67h для хранения данных (DDRAM), выводимых на ЖКИ. Адреса отображаемых на ЖКИ символов распределены следующим образом:

Символы, программируемые пользователем

Модуль содержит память для хранения изображений восьми символов, программируемых пользователем (CGRAM). Коды этих восьми символов показаны в табл. 5. Адреса строк изображений этих символов не зависят от адресов выводимых символов (расположены в отдельном адресном пространстве) и занимают адреса от 0h до 3Fh. Каждый символ занимает 8 байтов (0h–7h, 8h–Fh, 10h–17h, ..., 30h–37h, 38h–3Fh). Нумерация байтов идет в порядке отображения на модуле сверху вниз (первый байт самый верхний, восьмой байт самый нижний). Последняя, восьмая строка используется также для отображения курсора (если выбран курсор в виде подчеркивания). В каждом байте используются только 5 младших битов (4, 3, 2, 1, 0), старшие 3 бита (7, 6, 5) могут быть любые, на отображение они не влияют. Бит 4 соответствует левому столбцу матрицы символа, бит 0 - правому столбцу символа. Пример см. в таблице 3.

Таблица 3

* - значение не влияет на отображение

Описание команд модуля

Команда A0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Описание Время выполнения
Clear Display 0 0 0 0 0 0 0 0 0 1 Очищает модуль и помещает курсор в самую левую позицию 1,5 мс
Return Home 0 0 0 0 0 0 0 0 1 X Перемещает курсор в левую позицию 40 мкс
Entry Mode Set 0 0 0 0 0 0 0 1 ID SH Установка направления сдвига курсора (ID=0/1-влево/вправо) и разрешение сдвига дисплея (SH=1) при записи в DDRAM 40 мкс
Display ON/OFF control 0 0 0 0 0 0 1 D C B Включает модуль (D=1) и выбирает тип курсора (C, B), см. примечание 4 40 мкс
Cursor or Display Shift 0 0 0 0 0 1 RL X X Выполняет сдвиг дисплея или курсора (SC=0/1-курсор/дисплей, RL=0/1-влево/вправо) 40 мкс
Function Set 0 0 0 0 1 DL 1 0 P 0 Установка разрядности интерфейса (DL=0/1-4/8 бита) и страницы знакогенератора P 40 мкс
Set CGRAM Address 0 0 0 1 ACG Установка адреса для последующих операций (и установка туда курсора) и выбор области CGRAM 40 мкс
Set DDRAM Address 0 0 1 ADD Установка адреса для последующих операций и выбор области DDRAM 40 мкс
Read BUSY flag and Address 0 1 BS AC Прочитать флаг занятости и содержимое счетчика адреса 0
Write Data to RAM 1 0 WRITE DATA Запись данных в активную область 40 мкс
Read Data from RAM 1 1 READ DATA Чтение данных из активной области 40 мкс

Примечания:

  1. Указанное время выполнения команд является максимальным. Его не обязательно выдерживать при условии чтения флага занятости BS - как только флаг BS=0, так сразу можно писать следующую команду или данные. Если же флаг BS перед выдачей команд не проверяется - необходимо формировать паузу между командами не менее указанного времени для надежной работы модуля.
  2. При чтении бита статуса никакую паузу делать не надо.
  3. Большая Х - любое значение (0 или 1).
  4. Биты C и B в команде «Display ON/OFF control»: C=0, B=0 - курсора нет, ничего не мигает; C=0, B=1 - курсора нет, мигает весь символ в позиции курсора; C=1, B=0 - курсор есть (подчёркивание), ничего не мигает; C=1, B=1 - курсор есть (подчёркивание) и только он и мигает.

Таблица 5. Страница 0 встроенного знакогенератора

В таблице ниже представлен список драйверов, поставляемых с Qt. Due to license incompatibilities with the GPL, not all of the plugins are provided with Open Source Versions of Qt.

Имя драйверовDBMS IBM DB2 (версия 7.1 и выше) Borland InterBase MySQL Драйвер Oracle Call Interface Open Database Connectivity (ODBC) - Microsoft SQL Server и другие ODBC-совместимые базы данных PostgreSQL (версия 7.3 и выше) SQLite версии 2 SQLite версии 3 Sybase Adaptive Server Note: obsolete from Qt 4.7

SQLite is the in-process database system with the best test coverage and support on all platforms. Oracle via OCI, and PostreSQL and MySQL through either ODBC or a native driver are well-tested on Windows and Linux. The completeness of the support for other systems depends on the availability and quality of client libraries.

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

Сборка драйверов при запуске configure

Под Unix и Mac OS X, скрипт Qt configure пытается автоматически обнаружить доступные библиотеки на вашей машине. Запустив configure -help можно увидеть, какие драйвера могут быть собраны. Вы получите подобный список, подобный следующему:

No-sql- ... Выключить SQL полностью. -qt-sql- ... Включить SQL в Qt библиотеку, по умолчанию не включенную. -plugin-sql- Включить SQL как плагин для подключения во время выполнения программы. Доступные значения для : [ db2 ibase mysql oci odbc psql sqlite sqlite2 tds ]

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

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

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

Сборка плагинов вручную

QMYSQL для MySQL 4 и выше

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

В MySQL 5 введена поддержка хранимых процедур SQL уровня, но нет API контроля для IN, OUT и INOUT параметров. Поэтому, параметры должны быть установлены и прочитаны с использованием 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, глава "libmysqld, the Embedded MySQL Server Library", чтобы получить дополнительную информацию о встроенном сервере MySQL.

Как собрать QMYSQL плагин под Unix и Mac OS X

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

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

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

Как собрать OCI плагин под Unix и Mac OS X

Для 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/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/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

Note: If you are using the Oracle Instant Client package, you will need to set LD_LIBRARY_PATH when building the OCI SQL plugin and when running an applicaiton that uses the OCI SQL plugin. You can avoid this requirement by setting and RPATH and listing all of the libraries to link to. Вот пример:

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

If you wish to build the OCI plugin manually with this method the procedure looks like this:

Cd $QTDIR/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

Choosing the option "Programmer" in the Oracle Client Installer from the Oracle Client Installation CD is generally sufficient to build the plugin. For some versions of Oracle Client, you may also need to select the "Call Interface (OCI)" option if it is available.

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

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

Когда вы запускаете ваше приложение, вам необходимо добавить путь до oci.dll в переменную окружения PATH:

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

Замечание:

QODBC для Open Database Connectivity (ODBC)

Общая информация о 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, но не поддерживают необходимую функциональность. The QODBC plugin therefore checks whether the data source can be used after a connection has been established and refuses to work if the check fails. If you don"t like this behavior, you can remove the #define ODBC_CHECK_DRIVER line from the file qsql_odbc.cpp . Do this at your own risk!

By default, Qt instructs the ODBC driver to behave as an ODBC 2.x driver. However, for some driver-manager/ODBC 3.x-driver combinations (e.g., unixODBC/MaxDB ODBC ), telling the ODBC driver to behave as a 2.x driver can cause the driver plugin to have unexpected behavior. To avoid this problem, instruct the ODBC driver to behave as a 3.x driver by setting the connect option "SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3" before you open your database connection . Note that this will affect multiple aspects of ODBC driver behavior, e.g., the SQLSTATEs. Before setting this connect option, consult your ODBC documentation about behavior differences you can expect.

If you experience very slow access of the ODBC datasource, make sure that ODBC call tracing is turned off in the ODBC datasource manager.

Some drivers don"t support scrollable cursors. In that case case only queries in forwardOnly mode can be used successfully.

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

With Microsoft SQL Server the result set returned by a stored procedure that uses the return statement, or returns multiple result sets, will be accessible only if you set the query"s forward only mode to forward using QSqlQuery::setForwardOnly ().

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

Note: The value returned by the stored procedure"s return statement is discarded.

Поддержка Unicode в ODBC

The QODBC Plugin will use the Unicode API if UNICODE is defined. On Windows NT based systems, this is the default. Note that the ODBC driver and the DBMS must also support Unicode.

Some driver managers and drivers don"t support UNICODE. To use the QODBC plugin with such drivers it has to be compiled with the Q_ODBC_VERSION_2 defined.

For the Oracle 9 ODBC driver (Windows), it is neccessary to check "SQL_WCHAR support" in the ODBC driver manager otherwise Oracle will convert all Unicode strings to local 8-bit.

Как собрать ODBC плагин под Unix и Mac OS X

It is recommended that you use unixODBC. You can find the latest version and ODBC drivers at http://www.unixodbc.org . You need the unixODBC header files and shared libraries.

Tell qmake where to find the unixODBC header files and shared libraries (here it is assumed that unixODBC is installed in /usr/local/unixODBC) and run make:

Cd $QTDIR/src/plugins/sqldrivers/odbc qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" make

Как собрать ODBC плагин под Windows

The ODBC header and include files should already be installed in the right directories. You just have to build the plugin as follows:

Cd %QTDIR%\src\plugins\sqldrivers\odbc qmake odbc.pro nmake

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

Note: This database plugin is not officially supported for Windows CE.

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

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

The QPSQL driver supports version 7.3 and higher of the PostgreSQL server. We recommend that you use a client library from version 7.3.15, 7.4.13, 8.0.8, 8.1.4 or more recent as these versions contain security fixes, and as the QPSQL driver might not build with older versions of the client library depending on your platform.

Поддержка Unicode в QPSQL

The QPSQL driver automatically detects whether the PostgreSQL database you are connecting to supports Unicode or not. Unicode is automatically used if the server supports it. Note that the driver only supports the UTF-8 encoding. If your database uses any other encoding, the server must be compiled with Unicode conversion support.

Unicode support was introduced in PostgreSQL version 7.1 and it will only work if both the server and the client library have been compiled with multibyte support. More information about how to set up a multibyte enabled PostgreSQL server can be found in the PostgreSQL Administrator Guide, Chapter 5.

Поддержка BLOB в QPSQL

Binary Large Objects are supported through the BYTEA field type in PostgreSQL server versions >= 7.1.

Как собрать QPSQL плагин под Unix и Mac OS X

You need the PostgreSQL client library and headers installed.

To make qmake find the PostgreSQL header files and shared libraries, run qmake the following way (assuming that the PostgreSQL client is installed in /usr):

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

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

QTDS для Sybase Adaptive Server

Note: TDS is no longer used by MS Sql Server, and is superceded by . QTDS устарел начиная с Qt 4.7.

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

Как собрать QDB2 плагин под Unix и Mac OS X

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

In SQLite any column, with the exception of an INTEGER PRIMARY KEY column, may be used to store any type of value. For instance, a column declared as INTEGER may contain an integer value in one row and a text value in the next. This is due to SQLite associating the type of a value with the value itself rather than with the column it is stored in. A consequence of this is that the type returned by QSqlField::type () only indicates the field"s recommended type. No assumption of the actual type should be made from this and the type of the individual values should be checked.

The driver is locked for updates while a select is executed. This may cause problems when using QSqlTableModel because Qt"s item views fetch data as needed (with QSqlQuery::fetchMore() in the case of QSqlTableModel).

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

SQLite version 3 is included as a third-party library within Qt. It can be built by passing the following parameters to the configure script: -plugin-sql-sqlite (build as a plugin) or -qt-sql-sqlite (linked directly into the Qt library).

If you don"t want to use the SQLite library included with Qt, you can build it manually (replace $SQLITE by the directory where SQLite resides):

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

After installing Qt, as described in the Installing Qt for X11 Platforms document, you also need to install the plugin in the standard location:

Cd $QTDIR/src/plugins/sqldrivers/sqlite make install

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

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

SQLite minor releases sometimes break file format forward compatibility. For example, SQLite 3.3 can read database files created with SQLite 3.2, but databases created with SQLite 3.3 cannot be read by SQLite 3.2. Please refer to the SQLite documentation and change logs for information about file format compatibility between versions.

Qt minor releases usually follow the SQLite minor releases, while Qt patch releases follow SQLite patch releases. Patch releases are therefore both backward and forward compatible.

To force SQLite to use a specific file format, it is neccessary to build and ship your own database plugin with your own SQLite library as illustrated above. Some versions of SQLite can be forced to write a specific file format by setting the SQLITE_DEFAULT_FILE_FORMAT define when building SQLite.

QIBASE для Borland InterBase

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

The Qt InterBase plugin makes it possible to access the InterBase and Firebird databases. InterBase can either be used as a client/server or without a server in which case it operates on local files. The database file must exist before a connection can be established. Firebird must be used with a server configuration.

Note that InterBase requires you to specify the full path to the database file, no matter whether it is stored locally or on another server.

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

You need the InterBase/Firebird development headers and libraries to build this plugin.

Due to license incompatibilities with the GPL, users of the Qt Open Source Edition are not allowed to link this plugin to the commercial editions of InterBase. Please use Firebird or the free edition of InterBase.

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

By default the driver connects to the database using UNICODE_FSS. This can be overridden by setting the ISC_DPB_LC_CTYPE parameter with QSqlDatabase::setConnectOptions () before opening the connection.

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

If Qt doesn"t support the given text encoding the driver will issue a warning message and connect to the database using UNICODE_FSS.

Note that if the text encoding set when connecting to the database is not the same as in the database, problems with transliteration might arise.

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

InterBase/Firebird return OUT values as result set, so when calling stored procedure, only IN values need to be bound via QSqlQuery::bindValue (). The RETURN/OUT values can be retrieved via QSqlQuery::value (). Пример:

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

Как собрать QIBASE плагин под Unix и Mac OS X

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

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

If you are using Firebird, the Firebird library has to be set explicitly:

Cd $QTDIR/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%\src\plugins\sqldrivers\ibase qmake "INCLUDEPATH+=C:\interbase\include" ibase.pro nmake

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

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

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

Помните, что C:\interbase\bin должен быть в PATH .

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

Решение проблем

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

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

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

Make sure you have followed the guide to Deploying Plugins . If you experience plugin load problems and see output like this:

() и QSqlDriver и QSqlResult близко связаны. Когда используется Qt SQL драйвер, оба этих класса должны быть унаследованы в подклассах, причём все абстрактные виртуальные методы каждого класса должны быть реализованы.

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

Код ниже можно использовать в качестве основы для SQL драйвера:

class XyzResult: public QSqlResult { public : XyzResult(const QSqlDriver * driver) : QSqlResult { & /* options */ ) { return false ; } void close() {} QSqlResult * createResult() const { return new XyzResult(this ); } };

Qt дает возможность создания платформо-независимых приложений для работы с базами данных, используя стандартные СУБД. Qt включает «родные» драйвера для Oracle, Microsoft SQL Server, Sybase Adaptive Server, IBM DB2, PostgreSQL, MySQL и ODBC-совместимых баз данных. Qt включает специфичные для баз данных виджеты, а также поддерживает расширение для работы с базами данных любых встроенных или отдельно написанных виджетов.

Введение

Работа с базами данных в Qt происходит на различных уровнях:

1.Слой драйверов - Включает классы QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin и QSqlResult. Этот слой предоставляет низкоуровневый мост между определенными базами данных и слоем SQL API.

2.Слой SQL API - Этот слой предоставляет доступ к базам данных. Соединения устанавливаются с помощью класса QSqlDatabase. Взаимодействие с базой данных осуществляется с помощью класса QSqlQuery. В дополнение к классам QSqlDatabase и QSqlQuery слой SQL API опирается на классы QSqlError, QSqlField, QSqlIndex и QsqlRecord.

3.Слой пользовательского интерфейса - Этот слой связывает данные из базы данных с дата-ориентироваными виджетами. Сюда входят такие классы, как QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel.

Соединение с базой данных

Чтобы получить доступ к базе данных с помощью QSqlQuery и QSqlQueryModel, необходимо создать и открыть одно или более соединений с базой данных.

Qt может работать со следующими базами данных (из-за несовместимости с GPL лицензией, не все плагины поставляются с Qt Open Source Edition):

  • 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 нужно иметь соответствующую клиентскую библиотеку для используемой СУБД.

Соединиться с базой данных можно вот так:

QSqlDatabase db = QsqlDatabase::addDatabase("QMYSQL", "mydb");

db.setHostName("bigblue");

db.setDatabaseName("flightdb");

db.setUserName("acarlson");

db.setPassword("1uTbSbAs");

bool ok = db.open();

Первая строка создает объект соединения, а последняя открывает его. В промежутке инициализируется некоторая информация о соединении, включая имя соединения, имя базы данных, имя узла, имя пользователя, пароль. В этом примере происходит соединение с базой данных MySQL flightdb на узле bigblue. Аргумент «QMYSQL» в addDatabase() указывает тип драйвера базы данных, чтобы использовать для соединения, а «mydb» - имя соединения.

Как только соединение установлено, можно вызвать статическую функцию QSqlDatabase::database() из любого места программы с указанием имени соединения, чтобы получить указатель на это соединение. Если не передать имя соединения, она вернет соединение по умолчанию.

Если open() потерпит неудачу, он вернет false. В этом случае, можно получить информацию об ошибке, вызвав QSqlDatabase::lastError().

Для удаления соединения с базой данных, надо сначала закрыть базу данных с помощью QSqlDatabase::close(), а затем, удалить соединение с помощью статического метода QSqlDatabase::removeDatabase().

Выполнение инструкций SQL

Класс QSqlQuery обеспечивает интерфейс для выполнения SQL запросов и навигации по результирующей выборке. Для выполнения SQL запросов, просто создают объект QSqlQuery и вызывают QSqlQuery::exec(). Например, вот так:

QSqlQuery query;

query.exec("SELECT name, salary FROM employee WHERE salary > 50000");

Конструктор QSqlQuery принимает необязательный аргумент QSqlDatabase, который уточняет, какое соединение с базой данных используется. Если его не указать, то используется соединение по умолчанию. Если возникает ошибка, exec() возвращает false. Доступ к ошибке можно получить с помощью QSqlQuery::lastError().

QSqlQuery предоставляет единовременный доступ к результирующей выборке одного запроса. После вызова exec(), внутренний указатель QSqlQuery указывает на позицию перед первой записью. Если вызвать метод QSqlQuery::next() один раз, то он переместит указатель к первой записи. После этого необходимо повторять вызов next(), чтобы получать доступ к другим записям, до тех пор пока он не вернет false.

Вот типичный цикл, перебирающий все записи по порядку:

while (query.next()) {

QString name = query.value(0).toString();

int salary = query.value(1).toInt();

qDebug() << name << salary;

QSqlQuery может выполнять не только SELECT, но также и любые другие запросы. Следующий пример вставляет запись в таблицу, используя INSERT:

QSqlQuery query;

query.exec("INSERT INTO employee (id, name, salary) "

"VALUES (1001, "Thad Beaumont", 65000)");

Если надо одновременно вставить множество записей, то зачастую эффективней отделить запрос от реально вставляемых значений. Это можно сделать с помощью вставки значений через параметры. Qt поддерживает два синтаксиса вставки значений: поименованые параметры и позиционные параметры. В следующем примере показана вставка с помощью поименованного параметра:

QSqlQuery query;

"VALUES (:id, :name, :salary)");

query.bindValue(":id", 1001);

query.bindValue(":name", "Thad Beaumont");

query.bindValue(":salary", 65000);

В этом примере показана вставка с помощью позиционного параметра:

QSqlQuery query;

query.prepare("INSERT INTO employee (id, name, salary) "

"VALUES (?, ?, ?)");

query.addBindValue(1001);

query.addBindValue("Thad Beaumont");

query.addBindValue(65000);

При вставке множества записей требуется вызвать QSqlQuery::prepare() только однажды. Далее можно вызвать bindValue() или addBindValue() с последующим вызовом exec() столько раз, сколько потребуется.

Отображение данных в таблице-представлении

Классы QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel могут использоваться в качестве источников данных для классов представлений Qt, таких как QListView, QTableView и QTreeView. На практике наиболее часто используется QTableView в связи с тем, что результирующая SQL выборка, по существу, представляет собой двумерную структуру данных.

В следующем примере создается представление основанное на модели данных SQL:

QSqlTableModel model;

model.setTable("employee");

QTableView *view = new QTableView;

view->setModel(model);

view->show();

Если модель является моделью для чтения-записи (например, QSqlTableModel), то представление позволяет редактировать поля. Это можно отключить с помощью следующего кода

view->setEditTriggers(QAbstractItemView::NoEditTriggers);

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

Классы-представления для обозначения колонок наверху отображают заголовки. Для изменения текста заголовка, используется функция setHeaderData() модели. Например:

model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));

model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));

model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));

model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

Заключение

В данной статье изложены базовые принципы работы с базами данных в Qt. Однако кроме указанных здесь возможностей еще много интересного, например, транзакции, работа с внешними ключами или создание дата-ориентированых форм. К сожалению эти темы достаточно обширны для одной статьи.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: