I przyszedł czas na kolejną część kursu Qt. Dzisiaj o wykorzystaniu baz danych w swoich aplikacjach. Pokażę jak ustanawiać połączenie z bazą danych, wykonać na niej zapytania oraz kilka przydatnych sztuczek związanych z operowaniem na bazach. Miłego czytania!
Odmiennie niż zwykle, nie stworzymy aplikacji okienkowej, ale posłużymy się prostą, konsolową, która wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <qsqldatabase> #include <qsqlquery> #include <qdebug> #include <qstring> int main(int argc, char *argv[]) { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("qt"); db.setUserName("login"); db.setPassword("haslo"); if (!db.open()) { qDebug() < < "Błąd: nie można się połączyć z bazą!"; } else { qDebug() << "Nawiązano połączenie z bazą danych."; QSqlQuery dodawanie; dodawanie.exec("INSERT INTO test (imie, nazwisko, wiek) VALUES ('Stefan', 'Kowalski', '20')"); dodawanie.exec("INSERT INTO test (imie, nazwisko, wiek) VALUES ('Jan', 'Nowak', '36')"); QSqlQuery pobieranie; pobieranie.exec("SELECT * FROM test"); while (pobieranie.next()) { QString imie = pobieranie.value(1).toString(); QString nazwisko = pobieranie.value(2).toString(); int wiek = pobieranie.value(3).toInt(); qDebug() << imie << nazwisko << wiek; } } return 0; } |
W linii 8. dodajemy połączenie do bazy SQL, wybierając rodzaj sterownika, który odpowiada bazie, której chcemy użyć. Istnieje możliwość nadania nazwy dla naszego połączenia, dzięki czemu, możemy mieć wiele połączeń do tej samej bazy danych. Qt posiada mechanizm domyślnego połączenia (w przypadku gdy mamy ich więcej). Powoduje on, że jeżeli przy wywołaniu zapytania nie określimy bazy na której chcemy je wykonać, zostanie one wykonane na domyślnej bazie.
W liniach od 10. do 13. określamy parametry połączenia z bazą, jak adres, nazwa, login oraz hasło. W linii 15 sprawdzamy czy zostało otworzone połączenie aplikacji z bazą. Jeżeli wystąpił błąd, aplikacja o tym informuje i jest zamykana. W liniach od 23. do 25. dodajemy dwa rekordy do bazy, przy pomocy obiektu klasy QSqlQuery. Gdy dane zostaną dodane, tworzymy obiekt, którego celem będzie odczytywanie danych z bazy i uruchamiamy na nim zapytanie. Bardzo ważne: nie powinno się używać * (zrobiłem to z lenistwa). Najlepiej konkretnie wskazywać kolumny które chcemy pobrać. Wiąże się to z tym, że w przypadku dania *, kolejność kolumn jest niezdefiniowana i próba odczytania ich przy pomocy metody value() może przynieść inne rezultaty niż oczekiwaliśmy.
Sama metoda value() zwraca dane pobrane z bazy umieszczone w obiekcie klasy QVariant. Jako argument przyjmuje indeks kolumny którą chcieliśmy pobrać (liczone od zera).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | QSqlDatabase::database().transaction(); QSqlQuery query; query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'"); if (query.next()) { int employeeId = query.value(0).toInt(); query.exec("INSERT INTO project (id, name, ownerid) " "VALUES (201, 'Manhattan Project', " + QString::number(employeeId) + ')'); } QSqlDatabase::database().commit(); |
Powyższy przykład pokazuje jak wykorzystać mechanizm transakcji w bazie danych (jeżeli jest dostępny). Różnica w stosunku do normalnych zapytań jest taka, że fragment, który powinien być poddany transakcji zaczynamy od QSqlDatabase::database().transaction(); (czym informujemy o zaczęciu transakcji) a kończymy poprzez QSqlDatabase::database().commit();.
To czy baza udostępnia nam pewne mechanizmy, możemy sprawdzić wywołując metodę QSqlDriver::hasFeature(), jako parametr podając jedną z wartości enuma QSqlDriver::DriverFeature.
Z bazami to na razie tyle. Za jakiś czas pewnie wrócę do tego tematu. Jak zwykle repozytorium gita z kodem użytym w tej części kursu można pobrać stąd. Do następnego!




polski
Dobra robota! Czekam na następny odcinek kursu
Krótko, zwięźle i na temat. Czekam na kolejne części kursu ; )
Masz zamiar pisać coś więcej na temat OpenGL?
@Wolv: jeżeli bardziej poznam OpenGL (na co w najbliższym czasie się nie zapowiada, chyba że bardzo się zmotywuję do pisania własnego cRPG ;D) to pewnie rozszerzę. W planach mam dopisanie jeszcze coś o WebKitcie a dalej rozszerzenie i poprawienie już istniejących części kursu. Co potem to się zobaczy.
W takim razie czekam na jakąś ciekawą notkę o WebKitcie.
BTW: Pozwoliłem sobie na podlinkowanie do Twojego kursu Qt
@Wolv: po chrześcijańsku wybaczam. ;P