Kurs Qt – część 9 – SQL

Matthew @ 2010-05-28 — Kategorie: Kurs Qt, Programowanie, Qt

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:

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).

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!

Komentarze:

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

witam,mam pytanie,czy znasz jakis dobry kurs sql online? Dzieki:) p.s. Wiem ze troche nie na temat,ale moglby sie pojawic tutorial o zapisywaniu/odczytywaniu plikow,sam to wlasnie przerabiam w dokumentacji i widze ze moznaby pozyteczny tutorial z tego zrobic:)

Fajny kurs, a może wiesz szanowny autorze jak się dobrać do Firebirda?

U mnie wywala błąd ze nie może znaleźć qsqldatabase (nie mam tego nawet – sprawdzałem). Ale imho powinno być bo qt instalowałem na początku grudnia. I co mam robić szukać w necie tego pliku czy instalować qt sdk od nowa ?

@Drraven: dodaj linię QT += sql w pliku .pro

dzięki.

Mi wywala w momencie używania „QString”: ” Invalid use of incomplete type ‚struct QVaraint’ „.

zeby dodac cos do bazy test trzeba ja sobie najpierw utworzyc za pomoca jakiegos innego programu tak?
dodawanie.exec(„INSERT INTO test (imie, nazwisko, wiek) VALUES (‚Stefan’, ‚Kowalski’, ’20’)”); -> tutaj jest utworzona jakas baza danych o nazwie test?? da sie tworzyc takie bazy w qt bez odpalania innych programow?
QSqlDatabase db = QSqlDatabase::addDatabase(„QMYSQL”); -> sluzy tylko do nawiazania polaczenia z jakas baza??

Sory jezeli cos zamotalem, ale caly kod mi sie skompilowal ale nie sa obslugiwane te zapytania bo nie wyswietla mi sie ten qDebug() << imie << nazwisko << wiek;

Pierwsze co powinno się ukazać w tym tutorialu, to mocno wytłuszczona notka o tym, że qt po instalacji nie posiada pluginu MySQL! Trzeba go sobie ręcznie skompilować. Najlepiej użyć do tego wersji mysql-essential-5.1.56-win32, nawet na komputerach 64 bitowych (z 64 bitową wersją mysql plugin się nie skompiluje). Krótki poradnik dla systemów Windows:

1. Ściągamy instalator serwera mysql (wersja essential-5.1.56-win32 jako jedyna mi się skompilowała)
2. Instalujemy serwer mysql najlepiej do katalogu c:\MySQL (spacje w ścieżce powodują, że mamy więcej roboty do wykonania, lepiej ich unikać), przy instalacji zaznaczamy wszystkie komponenty
3. Wchodzimy do katalogu w którym zainstalowaliśmy serwer SQL a w nim w lib\opt (jeśli nie ma katalogu opt to się nie martwimy, wszystko będzie w katalogu lib) i kopiujemy plik libmysql.lib
4. Wklejamy libmysql.lib do katalogu %Qtdir%\src\plugins\sqldrivers\mysql (przez %Qtdir% rozumiem katalog binarek QT, czyli domyślnie C:\Qt\wersja.Qt\qt)
5. Pobieramy Mingw-utils 0.3 i instalujemy do mingw z QT (domyślnie C:\Qt\Wersja.Qt\mingw)
6. Odpalamy Qt Command Prompt (Start->Programy->Qt SDK-> Qt Command Prompt)
7. Przechodzimy do katalogu src\plugins\sqldrivers\mysql i wykonujemy kolejno polecenia:
reimp -d libmysql.lib
dlltool -k --input-def LIBMYSQL.def --dllname libmysql.dll --output-lib libmysql.a
qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+= -L./" mysql.pro
-k --input-def LIBMYSQL.def --dllname libmysql.dll --output-lib libmysql.a

8. Kopiujemy z libs\opt z katalogu instalacji mysql plik libmysql.dll i wklejamy go do %qtdir%\bin. Jeśli nie możemy znaleźć pliku libmysql.dll to możemy go pobrać z tej paczki: http://www.devqt.pl/mysql.zip (kopiujemy tylko plik libmysql.dll!)
9. Dla próby kompilujemy w qt creatorze program o następującym źródle:
QCoreApplication a(argc, argv);

QSqlDatabase base;
QStringList list;
QTextStream cout(stdout);
list=base.drivers();

cout<

@GwynBleidD: pozwolisz że to ja będę decydował co powinno się ukazać w tutorialu a co nie? Bo widzisz, to co dałeś to przykład tego jak to zrobić na windowsie co mnie specjalnie nie interesuje (wszystko i tak robię pod linuksem).

Chyba autor zapomniał w kodzie na początku dodać: #include , bo bez tego kompilator wypluwa: „invalid use of incomplete type ‚struct QVariant'” – a początkujących programistów jak ja może to zbić z tropu.
Może warto było dodać na początku jakąś notkę że obsługa MySQLa w QT wymaga samemu skompilowania drivera? Nie wiem jak sprawa tego drivera wygląda pod linuksem, ale Qt to fajne multiplatformowe api i równie dobrze programuje mi się w nim pod windą.

sorry, powinno być #include „QVariant”, w tych ostrych nawiasach, ale mi je wcieło.

@GwynBleidD: Próbowałem postępować za Twoimi wskazówkami, ale albo coś źle zrozumiałem, albo jest błąd. dochodzę do punktu 7. Jeśli dobrze zrozumiałem są to trzy polecenia. Pierwsze reimp, drugie dltool, trzecie qmake. Czy czwarta linijka należy też do qmake?

Ostatnia linia powinna wyglądać tak:
[code]mingw32-make[/code]

@Matthew: mógłbyś to poprawić?

Super kurs, dziekuje autorowi, co do użycia tego kursu w wersji 5.1.1 należy dodać linie w .pro

QT +=
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

bo inaczej czepia się o biblioteki.

pozdrawiam autora.

witam, rozumiem matthew że linuch jest fajny, super etc… (sam używam gentoo) ale chyba tego tutoriala nie pisałeś sam dla siebie, żeby pokazać jaki to jesteś „mundry” i wpadasz w samozachwyt nad opensource (sam bardzo lubię opensource) ale człowieku, jak wspierasz opensource, to nie ograniczaj tego do linucha, są inni którzy chcą programować też pod windozę, dużo czasu się napociłem, aby odnaleźć arta który opisuje jak poprawnie skompilować drivera do połączeń sql na windozę dla qt „creatury” 5.1.1 (dzięki wzmiance @GwynBleidD) – nawet po chamsku na prośbę @GwynBleidD nie poprawiłeś kodu o który prosił (to świadczy o tym jaki jesteś zakompleksiony, małostkowy itp szkoda słów na ciebie) – do pisania baz danych używam XAMPP i ktoś kto będzie szukał rozwiązania jak skompilować drivera pod windozę, to wszystko znajdzie pod linkiem niżej (rozumiem, że to twoje forum itp. ale jak piszesz coś dla ogółu to nie ograniczaj tego tylko do jednego systemu, ale weź pod uwagę wszystkich tak, jak to robią goście od opensource) – nie wywalaj tego komentarza mimo, że jest krytyczny do twojej osoby, dzięki krytyce się poprawisz!

za jedno dzięki, za tego tutoriala dzięki któremu zacząłem uczyć się Qt – jeszcze dużo brakuje ale małymi kroczkami idę dalej – jak możesz to napisz porządny kurs Qt z bazami SQL

link do zbudowania drivera – działa za pierwszym razem :)

http://www.seppemagiels.com/blog/create-mysql-driver-qt5-windows

Pozdrawiam twórcę i czytających

@bb:
Raz: tutorial napisałem żeby pokazać jak coś napisać (w Qt) a nie jak sobie zestawić środowisko do pisania (pod Windowsem). Wg. Twojej logiki powinienem poprzedzać każdą część tutoriala procesem instalacji Qt pod dowolną oficjalnie wspieraną platformę? I pewnie jeszcze kilka nieoficjalnych. Chyba nie tędy droga?
Dwa: open source nie zobowiązuje mnie (ani nikogo innego) do supportowania tej czy innej platformy. Nie ważne czy to jest kod źródłowy czy tutorial. Open source polega na udostępnianiu źródeł, nie zaś wspieraniu wszystkich możliwych platform bo ktoś inny ma taki kaprys. Źródła są dostępne, więc jeżeli chcesz to sam je portuj.
Trzy: nie po chamsku, po prostu nie zmieniam komentarzy innych osób. Nie chcę być później posądzany o takie praktyki. (plus lenistwo, ale tutaj wszystkich traktuję równo)
Cztery: Biorę pod uwagę użytkowników innych systemów. Jestem tolerancyjny i ich nie wyrzucam stąd (nawet jeżeli bezczelnie mi zarzucają różne rzeczy). Tutorial jest dla ogółu, Qt jest przenośne i tutorial nie zawiera informacji które uniemożliwiają użycie go na innych platformach. Ale w ramach tutoriala nie wchodzi ustawienia tych platform. Ja się skupiam na kodzie jaki można napisać.
Pięć: konstruktywna krytyka: tak. Ty mi po prostu wrzucasz, więc (po uwzględnieniu wyżej wypisanych założeń) po prostu to zignoruję.

Mi nawet nie chodziło o opisanie dokładnie tego, jak się kompiluje konkretne biblioteki pod bazę danych na tym, czy tamtym systemie, ale o samą wzmiankę w artykule, że może zajść potrzeba kompilacji tego ręcznie + ewentualny link do dokumentacji (gdzie jest to dobrze opisane od jakiegoś czasu) lub wzmianka, że opisywanie tego. nie jest częścią artykułu. Opisanie zresztą całego procesu byłoby przesadą, tym bardziej, że biorąc do serca sobie argumenty bb trzeba by opisać ten proces dla każdej platformy, jaką Qt oficjalnie (lub i nieoficjalnie) wspiera, np dla Androida… Od tego jest dokumentacja i tego się trzymajmy. Swój komentarz z opisem umieściłem, gdy nie było to jeszcze takie łatwe do odnalezienia i naprawdę było problematyczne…

Co do edycji komentarza, rozumiem i szanuję, jednak mały wyjątek nie zaszkodzi, tym bardziej gdy w tym samym artykule w komentarzu niżej o to proszę, a chodzi tylko o poprawienie błędu, a nie o zmianę merytorycznej treści komentarza.

dobra, spoko panowie, przynajmniej dobrze się z wami gada, jak kogoś uraziłem to przepraszam, wybaczcie mi, a tak w ogóle matthew dobrze by było gdybyś napisał kurs SQL-a jak zapisywać i odczytywać rekordy w GUI, przy pomocy pól tekstowych, obsługę zdarzeń przez przyciski itp (wiem, dużo wymagam) bo właśnie się z tym męczę, konsolówka działa dobrze ale to za mało… w każdym bądź razie, jak masz czas i duży zapas chęci to napisz coś takiego, byłbym bardzo wdzięczny

@GwynBleidD wierz mi, że trudno to było znaleźć jak skompilować tego drivera, wrzuciłem tutaj tego linka, żeby ludziki się nie męczyły z poszukiwaniami i d… nie zawracały jak „skompilować drivera”

POZDRAWIAM :D

http://qt-project.org/doc/qt-5/sql-driver.html#qmysql

Naprawdę nie jest to tak trudno znaleźć, jest w dokumentacji bardzo dobrze opisane. Oczywiście w odróżnieniu od artykułu, który podałeś, dokumentacja nie rozwodzi się nad tym w jaki sposób zainstalować Qt i biblioteki MySQL. Cała reszta jest dokładnie rozpisana, dla każdego obsługiwanego przez MySQL i Qt na raz środowiska i dla każdego obsługiwanego przez oba na raz kompilatora/toolchaina. Szkoda jednak dyskutować, oba linki na pewno się początkującym przydadzą :)

Dodaj komentarz:

 

Subscribe without commenting