Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 75

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QSqlDatabase::addDatabase() для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QSqlDatabase. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ addDatabase() Π·Π°Π΄Π°Π΅Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Qt Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ MySQL (??? β€” Π² ΠΊΠΎΠ΄Π΅ QOCI, Oracle Call Interface).

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ устанавливаСм имя хоста Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, имя Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС. Если функция open() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сообщСниС ΠΎΠ± ошибкС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QSqlError::showMessage().

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ createConnection() Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π² main():

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 if (!createConnection())

05 return 1;

06 return app.exec();

07 }

ПослС установки соСдинСния ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ QSqlQuery для выполнСния любой инструкции SQL, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SELECT:

QSqlQuery query;

query.exec("SELECT title, year FROM cd WHERE year >= 1998");

ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса:

while (query.next()) {

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

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

cerr << qPrintable(title) << ": " << year << endl;

}

ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ next() ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для позиционирования QSqlQuery Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ запись ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ next() ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ записи Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ дальшС, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достигнут ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠΎΠ³Π΄Π° функция next() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ (result set) пустой (ΠΈΠ»ΠΈ запрос Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ), ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ next() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ false.

Ѐункция value() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля, ΠΊΠ°ΠΊ QVariant. Поля ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ начиная с 0 Π² порядкС ΠΈΡ… указания Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ SELECT. Класс QVariant ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π‘++ ΠΈ Qt, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ int ΠΈ QString. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π‘++ ΠΈ Qt ΠΈ хранятся Π² QVariant. НапримСр, VARCHAR прСдставляСтся Π² Π²ΠΈΠ΄Π΅ QString, a DATETIME β€” Π² Π²ΠΈΠ΄Π΅ QDateTime.

Класс QSqlQuery содСрТит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для просмотра Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π°: first(), last(), previous() ΠΈ seek(). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, Π½ΠΎ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΈ Ρ€Π°ΡΡ…ΠΎΠ΄ΠΎΠ²Π°Ρ‚ΡŒ памяти большС, Ρ‡Π΅ΠΌ функция next(). ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QSqlQuery::setForwardOnly(true) ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ exec(), ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ next() для просмотра Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π°.

Π Π°Π½Π΅Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π²Π°Π»ΠΈ запрос SQL Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QSqlQuery::exec(), Π½ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ нСпосрСдствСнно конструктору, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сразу ΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π΅Π³ΠΎ:

QSqlQuery query("SELECT title, year FROM cd WHERE year >= 1998");

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибки, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ isActive() для запроса:

if (!query.isActive())

QMessageBox::warning(this, tr("Database Error"),

query.lastError().text());

Если ошибки Π½Π΅Ρ‚, запрос становится Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΒ» ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ next() для пСрСмСщСния ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ INSERT осущСствляСтся ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ просто, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SELECT:

QSqlQuery query("INSERT INTO cd (id, artistid, title, year) "

"VALUES (203, 102, 'Living in America', 2002)");

ПослС этого функция numRowsAffected() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ инструкциСй SQL (ΠΈΠ»ΠΈ β€”1, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка).

Если Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ записСй ΠΈΠ»ΠΈ Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² строковыС Π΄Π°Π½Π½Ρ‹Π΅ (ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ прСобразования ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ prepare() для указания ΠΏΠΎΠ»Π΅ΠΉ Π² шаблонС запроса ΠΈ Π·Π°Ρ‚Π΅ΠΌ присваивания ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Qt ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡΡ‚ΠΈΠ»ΡŒ Oracle, Ρ‚Π°ΠΊ ΠΈ ΡΡ‚ΠΈΠ»ΡŒ ODBC для всСх Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, примСняя, Π³Π΄Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Β«Ρ€ΠΎΠ΄Π½ΠΎΠΉΒ» интСрфСйс Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ имитируя Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксис Oracle для прСдставлСния ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

"VALUES (:id, :artistid, :title, :year)");

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

query.bindValue(":artistid", 102);

query.bindValue(":title", "Living in America");

query.bindValue(":year", 2002);

query.exec();

НиТС приводится Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ прСдставлСния ΠΏΠΎΠ»Π΅ΠΉ Π² стилС ODBC:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

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

query.addBindValue(203);

query.addBindValue(102);

query.addBindValue("Living in America");

query.addBindValue(2002);

query.exec();

ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ bindValue() ΠΈΠ»ΠΈ addBindValue() для присваивания Π½ΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π°Ρ‚Π΅ΠΌ снова Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ exec() для выполнСния запроса ΡƒΠΆΠ΅ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями.

Π’Π°ΠΊΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для задания Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… строковых Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащих символы Π½Π΅ Π² ΠΊΠΎΠ΄Π΅ ASCII ΠΈΠ»ΠΈ Latin-1. НСзамСтно для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Qt ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Unicode Π² Ρ‚Π΅Ρ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Unicode, Π° Π² Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ этого, Qt Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строковыС Π΄Π°Π½Π½Ρ‹Π΅ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ.

Qt ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ SQLβ€”Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² Ρ‚Π΅Ρ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ ΠΎΠ½ΠΈ прСдусмотрСны. Для запуска Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ transaction() для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QSqlDatabase, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ commit(), Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rollback(). НапримСр, Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ внСшний ΠΊΠ»ΡŽΡ‡ (foreign key) ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ INSERT Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ:

QSqlDatabase::database().transaction();

QSqlQuery query;

query.exec("SELECT id FROM artist WHERE name= 'Gluecifer'");

if (query.next()) {

int artistId = query.value(0).tolnt();

query.exec("INSERT INTO cd (id, artistid, title, year) "

"VALUES (201, " + QString::number(artistId)

+ ", 'Riding the Tiger', 1997)");

}

QSqlDatabase::database().commit();

Ѐункция QSqlDatabase::database() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QSqlDatabase, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ соСдинСниС, созданноС Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ createConnection(). Если транзакция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ, функция QSqlDatabase::transaction() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false. НСкоторыС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’ этом случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ transaction(), commit() ΠΈ rollback() Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hasFeature() для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QSqlDriver, связанного с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…:

QSqlDriver *driver = QSqlDatabase::database().driver();

if (driver->hasFeature(QSqlDriver::Transactions))

…

МоТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ряда Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² BLOB (Binary Large Objects β€” большиС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), Unicode ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Ρ… запросов.

Π’ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄Π½ΠΎ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько соСдинСний, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ соСдинСния Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ addDatabase(). НапримСр:

QSqlDatabase *db = QSqlDatabase::addDatabase("QPSQL", "OTHER");

db. setHostName("saturn.mcmanamy.edu");

db.setDatabaseName("starsdb");

db.setUserName("hilbert");

db.setPassword("ixtapa7");

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QSqlDatabase, пСрСдавая Π½Π°Π·Π²Π°Π½ΠΈΠ΅ соСдинСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QSqlDatabase::database():

QSqlDatabase db = QSqlDatabase::database("OTHER");

Для выполнСния запросов с Π΄Ρ€ΡƒΠ³ΠΈΠΌ соСдинСниСм ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QSqlDatabase конструктору QSqlQuery:

QSqlQuery query(db);

query.exec("SELECT id FROM artist WHERE name = 'Mando Diao'");

НСсколько соСдинСний ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠΉ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ нСсколько соСдинСний с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ всС-Ρ‚Π°ΠΊΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π½Π΅ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ соСдинСниС ΠΈ QSqlQuery Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это соСдинСниС, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ соСдинСниС.

ΠšΡ€ΠΎΠΌΠ΅ QSqlQuery Qt содСрТит класс QSqlTableModel β€” интСрфСйс высокого уровня, позволяя Π½Π°ΠΌ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ выраТСния SQL Β«Π² чистом Π²ΠΈΠ΄Π΅Β» для выполнСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных SQLβ€”ΠΊΠΎΠΌΠ°Π½Π΄ (SELECT, INSERT, UPDATE ΠΈ DELETE). Π­Ρ‚ΠΎΡ‚ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΈΠ»ΠΈ Π² качСствС источника Π΄Π°Π½Π½Ρ‹Ρ… для QListView ΠΈΠ»ΠΈ QTableView.

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования QSqlTableModel для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SELECT: