Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

Pobieramy i wyświetlamy dane z bazy MySQL w C++

W poprzednim artykule, pokazałem jak należy połączyć się z serwerem bazodanowym bezpośrednio z poziomu kodu C++. Naszym celem jest jednak zaimplementowanie tego mechanizmu do zbudowanego wcześniej systemu rezerwacji biletów w kinie, aby to zrobić musimy jeszcze zapoznać się z tym jak pobrać i wyświetlić dane przechowywane w tabelach bazy MySQL.

Zaczniemy od rozbudowy ostatnio napisanego programu:

#include <iostream>
#include <mysql.h>

int main(int argc, const char * argv[])
{
    MYSQL mysql;

    mysql_init(&mysql); // incjalizacja
    
    if(mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0))
        printf("Połączenie z bazą danych MySQL nawiązano poprawnie!\n");
    else
        printf("Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno(&mysql), mysql_error(&mysql));
    
    mysql_close(&mysql); // zamknij połączenie
    
    return 0;
}

Przede wszystkim będziemy potrzebowali zmiennej typu MYSQL_RES do przechowywania wskaźnika identyfikującego zapytanie (id zapytania) oraz zmiennej typu MYSQL_ROW do przechowywania pobranego wiersza z bazy.

MYSQL_RES *idZapytania;
MYSQL_ROW  wiersz;

Zanim przejdziemy dalej, musimy jeszcze określić nazwę bazy danych z której chcemy skorzystać (w moim przypadku będzie to domyślna baza tworzona podczas instalacji MySQL):

mysql_select_db(&mysql, "mysql");

Ogólna składnia:

mysql_select_db(MYSQL &mysql, "nazwaBazyDanych");

Przyszła pora na gwóźdź programu czyli wykonanie odpowiedniej kwerendy SQL. Robimy to przy pomocy funkcji mysql_query():

mysql_query(&mysql, "SELECT * FROM tabela");

Ogólna składnia:

mysql_query(MYSQL &mysql, "kwerenda" );

Będziemy jeszcze potrzebowali idZapytania, pobierzemy go za pomocą funkcji mysql_store_result():

MYSQL_RES *idZapytania = mysql_store_result(&mysql);

Mamy już wszystkie potrzebne dane, musimy to jeszcze jakoś wyświetlić. Konkretny wiersz możemy pobrać za pomocą funkcji mysql_fetch_row(), której jedynym argumentem jest właśnie uzyskane wcześniej idZapytania:

MYSQL_ROW wiersz = mysql_fetch_row(idZapytania)

Aby dostać się do danych z konkretnej kolumny, zmienną wiersz traktujemy po prostu jak tablicę i w nawiasach kwadratowych podajemy numer kolumny (liczony od 0):

cout << wiersz[0];

Liczbę wszystkich kolumn możemy uzyskać za pomocą funkcji mysql_num_fields(), której argumentem jest uzyskane wcześniej idZapytania:

mysql_num_fields(idZapytania);

Teraz możemy wszystko „ładnie” opakować w pętlę while i wyświetlić:

while((wiersz = mysql_fetch_row(idZapytania)) != NULL)
{
     for(int i = 0;i < mysql_num_fields(idZapytania); i++)
          cout << wiersz[i] << " ";
     cout << endl;
}

Cały program:

#include <iostream>
#include <mysql.h>

using namespace std;

int main(int argc, const char * argv[])
{
    MYSQL mysql;
    
    mysql_init(&mysql); // incjalizacja
    
    if(mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0))
        printf("Połączenie z bazą danych MySQL nawiązano poprawnie!\n");
    else
        printf("Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno(&mysql), mysql_error(&mysql));
    
    MYSQL_RES *idZapytania;
    MYSQL_ROW  wiersz;
    
    mysql_select_db(&mysql, "mysql");
    mysql_query(&mysql, "SELECT * FROM help_category LIMIT 5" );
    idZapytania = mysql_store_result(&mysql);
    
    while((wiersz = mysql_fetch_row(idZapytania)) != NULL)
    {
        for(int i = 0;i < mysql_num_fields(idZapytania); i++)
            cout << wiersz[i] << " ";
        cout << endl;
    }
    
    mysql_close(&mysql); // zamknij połączenie
    
    return 0;
}

Przykładowy rezultat wykonania powyższego kodu:

Połączenie z bazą danych MySQL nawiązano poprawnie!
1 Geographic 0
2 Polygon properties 35
3 WKT 35
4 Numeric Functions 39
5 Plugins 36

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , , , , , ,

Dodaj komentarz

Komentarze (2)

  • Johny Bravo pisze:

    A wiesz może jak zapisać wynik zapytania w zmiennej (np. nick w string, a wynik w int)?

    • Johny Bravo pisze:

      Spoko już umiem. Dla osób, którym też to nie wychodziło:
      string nick; nick = wiersz[i];
      Dzięki za pomoc, świetny poradnik, tylko chciałem zwrócić uwagę na to, że ten kod nie każdemu będzie działać, bo u ciebie jest MYSQL mysql; a mnie działa MYSQL *mysql; poza tym przy moim sposobie nigdzie nie można używać &mysql tylko mysql;

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest