qt_sql

[Kurs Qt] Komunikacja z bazą danych

Z tej lekcji dowiesz się w jaki sposób możesz się komunikować z bazą danych przy użyciu Qt.

Z tego co mi się wydaje, to nie trzeba tłumaczyć czym są bazy danych, ani do czego służą. Nie da się ukryć, że są przydatne, szczególnie wtedy gdy piszemy program sieciowy bazujący np. na wielu użytkownikach, którzy mogą mieć np. różne prawo dostępu do poszczególnych sekcji programu.

Istnieje wiele rodzajów baz danych, lecz my w dzisiejszym kursie skorzystamy z MySQL, które jest darmowe i zarazem najbardziej popularne.

Chciałbym zaznaczyć, że to nie jest kurs SQL (czy też jego zapytań itp.), ta lekcja pokazująca interakcje pomiędzy programem i bazą danych.

 

Przygotowanie bazy danych


Przed rozpoczęciem musimy się oczywiście zaopatrzyć w serwer posiadający MySQL, który będzie zezwalał na komunikację pomiędzy programem, a bazą danych. Tutaj możemy albo zainwestować w prawdziwy serwer lub możemy uruchomić serwer lokalnie przy użyciu pakietu XAMPP (jak stworzyć serwer lokalnie pokazuje Mirosław Zelent).

 

Przygotowanie Qt Creatora


Aby móc korzystać z dobrodziejstw klas do obsługi SQL należy dopisać do pliku .pro (po utworzeniu projektu) następującą linię:

 

Błędy

Jeżeli jesteś użytkownikiem Windowsa i w dalszej części lekcji otrzymasz błąd podobny do tego:

To rozwiązaniem problemu jest pobranie tej paczki (należy zwrócić uwagę ilu-bitowy mamy kompilator) i przekopiowanie pliku „libmysql.dll” z folderu /bin do:

<ścieżka instalacji Qt> / Qt / <wersja Qt> / mingw<wersja> / bin

Ponowna kompilacja programu powinna już nie generować tego problemu.

 

Prosty program


Dzisiaj chciałbym przedstawić działanie QtSql w nieco niestandardowy dla mnie sposób, czyli na programie napisanym przy użyciu konsoli.

Zadanie programu jest połączenie się z bazą danych, wyświetlenie nazw wszystkich tabeli, a następnie wyświetlenie rekordów z przykładowej tabeli Stats.

Linie [1-2] odpowiadają za możliwość korzystania w programie z baz danych oraz możliwość korzystania z kwerend.

Stworzenie instancji do bazy danych jest wykonane w linii [8], gdzie pierwszym argumentem jest sterownik bazy danych (więcej informacji o sterownikach znajdziesz tutaj), opcjonalnym w naszym przypadku jest drugi argument, który pozwala nadać nazwę naszemu połączeniu. Jest to przydatne gdy program wykonuje połączenia z większą ilością baz danych.

Linie [10-13] odpowiadają za ustawienie:

  • hosta, jako argument podajemy adres do serwera z bazą danych;
  • nazwę bazy danych, na której chcemy pracować;
  • login;
  • hasło.

Standardowe login i hasło do baz danych postawionych przy użyciu XAMPP jest umieszczone w folderze instalacyjnym xampp: /…/xampp/passwords.txt .

Linia [15] odpowiada za sprawdzenie czy udało nas się uzyskać dostęp do bazy danych, jeżeli nie to problem może stanowić zła nazwa loginu i hasła, nazwa bazy danych, host, etc.

[19-21] odpowiadają za pobranie nazw tabeli w bazie i wyświetlenie ich w konsoli.

W [23] tworzymy kwerendę, następnie w [24] wykonujemy ją poprzez użycie exec(). Składnia kwerendy powinna być nam znana, tutaj wyciągamy wszystkie elementy z tabeli Stats.

Kolejnym wyróżniającym fragmentem kodu jest pętla, której zadaniem jest wyciągnięcie informacji o ilościach zabójstw gracza oraz jego śmierci.

Dokonujemy tego na dwa sposoby:

  1. Przez podanie nazwy kolumny.
  2. Przez podanie numeru indeksu kolumny (numerujemy od 0).

[35] służy do zamknięcia połączenia z bazą danych.

Po dodaniu i uruchomieniu programu na przykładowej bazie danych, program mi zwrócił wartości:

Jak widzimy całość jest prosta i opiera się w większości na znajomości składni języka SQL, dzięki czemu pisanie w c++ przychodzi intuicyjnie.

Oczywiście Qt zawiera więcej możliwości jeżeli chodzi o bazy danych, ale o nich opowiem może w przyszłości.

Code ON!


  • Marian Kb

    Do tworzenia lokalnych baz danych polecam także WampServer

  • ZielonyW

    A co jeśli chcę się komunikować z inną bazą danych niż MySql, np PostgreSQL?

  • nowy

    Mimo wszystko nie łączy mi się z bazą danych. Podaje dobry login i hasło oraz nazwę bazę danych a jako nazwę hosta daje: „mysql.cba.pl” i to własnie nie działa

    • Nie jestem w stanie powiedzieć co robisz nie tak, skorzystaj z lastError() aby dowiedzieć się jaka może być przyczyna
      https://doc.qt.io/qt-5/qsqldatabase.html#lastError

      • nowy

        Ostatnia przyczyna: QSqlError(„”, „”, „”)

        • Nie jestem w stanie Ci pomóc, nie spotkałem się z takim problemem 😉

          • nowy

            A takowy?
            QSqlError(„2003”, „QMYSQL: Nie można nawiązać połączenia”, „Can’t connect to MySQL server on ‚127.0.0.1’ (10061)”)

          • To co jesteś sam w stanie wydedukować po prostu go czytając: qt próbuje się łączyć z serwerem postawionym lokalnie (127.0.0.1 to localhost) oraz pewnie na porcie 10061.

            Bez kodu więcej nie da się wyciągnąć z tego komunikatu.

            Btw polecam zmienić język w Qt Creator na angielski, to będzie łatwiej ci szukać informacji w sieci