Kilka słów na początek.
W poprzednim wpisie przedstawiłem w jaki sposób kierować zapytania do bazy danych MySQL. W celu odczytania danych po zapytaniu, należy wykorzystać dodatkowe funkcje, które umożliwią nam swobodne odczytanie danych.
Zakres artykułu.
- Program w C
- Plik Makefile
- Testy
Program w C
Kod programu, który pozwoli na przetestowanie odpowiedzi zapytania do bazy danych MySQL zapisałem w pliku main.c i wygląda następująco.
#include <stdio.h> #include <mysql/mysql.h> int main(int argc, char **argv) { int i = 0; int j = 0; MYSQL *dbConn; char *dbServer = "localhost"; char *dbUser = "nazwaUzytkownika"; char *dbPassword = "hasloUzytkownika"; char *dbName = "testowaBazaDanych"; unsigned int liczbaKolumn = 0; my_ulonglong liczbaWierszy = 0; MYSQL_RES *res; MYSQL_ROW row; dbConn = mysql_init(NULL); /* Nazwiązanie połączenia z bazą danych */ if (!mysql_real_connect(dbConn, dbServer, dbUser, dbPassword, dbName, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(dbConn)); return 1; } fprintf(stdout, "Polaczenie z baza danych przebieglo pomyslnie\n"); if (mysql_query(dbConn, "SELECT * FROM testowaTabela")) { fprintf(stderr, "%s\n", mysql_error(dbConn)); return 1; } res = mysql_store_result(dbConn); liczbaKolumn = mysql_field_count(dbConn); fprintf(stdout, "Liczba kolumn: %d\n", liczbaKolumn); liczbaWierszy = mysql_num_rows(res); fprintf(stdout, "Liczba wierszy: %d\n", liczbaWierszy); for(i=0; i<liczbaWierszy; i++) { row = mysql_fetch_row(res); for(j=0; j<liczbaKolumn; j++) { printf("%s \t", row[j]); } printf("\n"); } /* Zamykanie połączenia */ mysql_free_result(res); mysql_close(dbConn); return 0; }
MYSQL_RES *mysql_store_result(MYSQL *mysql) – funkcja ta alokuje strukturę MYSQL_RES a następnie zwraca do niej cały wynik zapytania. W przypadku kiedy zostanie zwrócona wartość NULL oznacza to, że zapytanie nie zwróciło żadnego wyniku (sytuacja ta ma miejsce przy zapytaniu wstawiania lub tworzenia bazy danych) lub wystąpił błąd. W celu zweryfikowania, czy zapytanie nic nie zwróciło, czy pojawił się błąd możemy zastosować funkcję mysql_field_count(), której opis zamieściłem poniżej. Funkcję mysql_store_result() stosujemy po zastosowaniu funkcji mysql_query(), bądź mysql_real_query(), które mogą zwrócić wynik. Po zakończeniu działania na zwróconych danych, należy zwolnić zarezerwowaną pamięć poprzez zastosowanie funkcji mysql_free_result().
unsigned int mysql_field_count(MYSQL *mysql) – funkcja ta zwraca liczbę kolumn ostatniego zapytania, które zostało skierowane do bazy danych.
my_ulonglong mysql_num_rows(MYSQL_RES *result) – funkcja ta zwraca liczbę wierszy zapytania, które zostało skierowane do bazy danych.
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) – funkcja ta zwraca strukturę MYSQL_ROW kolejnego wiersza lub wartość NULL. Znaczenie wartości NULL jest uzależnione od funkcji, która została uprzednio wywołana. W przypadku jeśli funkcja mysql_fetch_row() została wywołana po funkcjach takich jak mysql_store_result() lub mysql_store_result_nonblocking(), wówczas NULL oznacza, że nie ma więcej wierszy do odczytania. W przypadku jeśli funkcja mysql_fetch_row() została wywołana po funkcjach takich jak mysql_use_result(), mysql_fetch_row() wówczas NULL oznacza, że nie ma więcej wierszy do odczytania lub pojawił się błąd.
void mysql_free_result(MYSQL_RES *result) – funkcja ta zwalnia zaalokowaną pamięć dla wyniku otrzymanego po wywołaniu między innymi funkcji takich jak mysql_store_result(), mysql_use_result(), mysql_list_dbs(). Funkcja ta nie zwraca żadnej wartości.
Dokładniejszy opis powyższuch funkcji znajdziemy na stronie:
https://dev.mysql.com/doc/refman/8.0/en/c-api-functions.html
Plik Makefile
Konstrukcję pliku Makefile przedstawiłem we wpisie Programowanie w C – RPi – Bazy Danych – Pierwszy program
Testy
Przed przystąpieniem do testowania, aby była możliwość sprawdzenia poprawności programu, dodałem do bazy danych kilka rekordów.
Gdy już mamy przygotowany program w C (main.c), plik Makefile oraz dane w bazie danych możemy przejść do kompilacji oraz uruchomienia naszego programu.
W konsoli wpisujemy polecenie:
$ make
Następnie uruchamiamy program poleceniem:
$ ./test
Wynik jaki otrzymamy powinien wyglądać następująco:
Polaczenie z baza danych przebieglo pomyslnie
Liczba kolumn: 6
Liczba wierszy: 3
1 Test nazwy 26 190.1 Test opisu mail@gmail.com
2 Test2 22 111.1 Opis test 2 emailTest2@gmail.com
3 Tescik3 1 1.44 Opis test 3 ddd@eee.dd
Otrzymane wyniki pokrywają się z tym co znajduje się w bazie danych.