Работа с бази данни в Qt

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. UI слой - Този слой свързва данните от базата данни с ориентираните към данни уиджети. Това включва класове като 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 Driver
  • QODBC - Отворена връзка с база данни (ODBC) -Microsoft SQL Server и други ODBC съвместими бази данни
  • QPSQL - PostgreSQL (версия 7.3 и по-нова)
  • QSQLITE2 - SQLite версия 2
  • QSQLITE - SQLite версия 3
  • QTDS - Sybase Adaptive Server Driver

За да създадете плъгин на драйвер, който не е включен в дистрибуцията на Qt, трябва да имате подходящата клиентска библиотека за използваната СУБД.

Можете да се свържете с базата данни по следния начин:

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

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(). Например така:

query.exec("ИЗБЕРЕТЕ име, заплата ОТ служител WHERE заплата > 50000");

Конструкторът QSqlQuery приема незадължителен аргумент QSqlDatabase, който указва коя връзка с база данни да се използва. Ако не е указано, се използва връзката по подразбиране. Ако възникне грешка, exec() връща false. Грешката може да бъде достъпна чрез QSqlQuery::lastError().

QSqlQuery предоставя еднократен достъп до резултантната селекция на една заявка. След като се извика exec(), вътрешният указател на QSqlQuery сочи към позицията преди първия запис. Ако извикате метода QSqlQuery::next() веднъж, той ще премести показалеца към първия запис. След това извикването next() трябва да се повтори за достъп до други записи, докато върне false.

Ето типичен цикъл, който итерира всички записи в ред:

Име на QString = query.value(0).toString();

int заплата = query.value(1).toInt();

qDebug() Показване на данни в табличен изглед

Класовете QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel могат да се използват като източници на данни за класове изгледи на Qt като QListView, QTableView и QTreeView. На практика най-често се използва QTableView поради факта, че получената SQL селекция е по същество двуизмерна структура от данни.

Следният пример създава изглед, базиран на SQL модела на данни:

QTableView *view = нов QTableView;

Ако моделът е модел за четене и запис (например QSqlTableModel), тогава изгледът позволява редактиране на полета. Това може да бъде деактивирано със следния код

Можете да използвате същия модел като източник на данни замножество изгледи. Ако потребителят промени данните на модела, използвайки един от изгледите, другите изгледи веднага ще отразят промените.

Преглед на класове показва заглавия в горната част, за да обозначи колони. За да промените текста на заглавката, използвайте функцията setHeaderData() на модела. Например:

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

model->setHeaderData(1, Qt::Horizontal, QObject::tr("Име"));

model->setHeaderData(2, Qt::Horizontal, QObject::tr("Град"));

model->setHeaderData(3, Qt::Horizontal, QObject::tr("Държава"));

Тази статия очертава основните принципи на работа с бази данни в Qt. Въпреки това, в допълнение към изброените тук функции, все още има много интересни неща, например транзакции, работа с външни ключове или създаване на формуляри, ориентирани към данни. За съжаление тези теми са доста обширни за една статия.