[ Pobierz całość w formacie PDF ]
.Wrzeczywistości nie jest to do końca prawdą, ponieważ możemy wywołać mysql_num_rows, lecznie otrzymamy wtedy liczby dostępnych wierszy aż do momentu pobrania ostatniego z nich zapomocą funkcji mysql_fetch_result.Faktycznie więc nie przyda się to do niczego.Powiększamy także opóznienie miedzy żądaniami pobrania wiersza, ponieważ za każdym razemmusi on być przesyłany przez sieć.Dodatkowy problem może stwarzać możliwość wystąpieniabłędu sieci podczas utrzymywania otwartego połączenia z bazą danych, zanim wszystkie danezostaną pobrane.Nie będziemy wówczas mieli rzeczywistego dostępu do danych, ponieważ nie sąone przechowywane lokalnie.Mamy także duże korzyści: wyrównujemy obciążenie sieci i znacznie zmniejszamy potencjalnieduże zapotrzebowanie na pamięć (ang.storage overhead) w programie klienta.Przy dużychzestawach danych prawie zawsze preferuje się pobieranie wiersza po wierszu za pomocą funkcjimysql_use_result.Zmiana w programie select1.c polegająca na użyciu funkcji mysql_use_result jest łatwa doprzeprowadzenia.Otrzymujemy w ten sposób program select2.c, w którym zaznaczyliśmyzmienione wiersze:if (res) {printf("SELECT error: %s\n", mysql_error(&my_connection));} else {res_ptr = mysql_use_result(&my_connection);if (res_ptr) {while ((sqlrow = mysql_fetch_row(res_ptr))) {printf("Fetched data.\n");}if (mysql_errno(&my_connection)) {printf("Retrieve error: %s\n", mysql_error(&my_connection)); }}mysql_free_result(res_ptr);}Zwróćmy uwagę na to, że nie jest tu znana liczba wierszy pobranych bezpośrednio po otrzymaniuwyniku.Oprócz tego użyto tutaj wcześniej stosowanej metody obsługi błędów polegającej nasprawdzaniu wartości zwracanej przez mysql_errno(&my_connection).Pisząc programwykorzystujący funkcję mysql_store_result i mając zamiar zmienić ją w przyszłości nafunkcję mysql_use_result, lepiej od razu wprowadzić stosowne zmiany.Dla pewności możnatakże sprawdzać wartości zwracane przez wszystkie funkcje.Przetwarzanie zwróconych danychSamo pobieranie danych nie ma większego sensu, jeżeli nie będziemy z nimi niczego robić.Podobnie jak w bazie PostgreSQL, tutaj również rozróżnia się dwa rodzaje danych:Rzeczywista informacja pobrana z bazy danych.Informacja na temat danych, czyli tzw.metadane (ang.metadata).Najpierw zobaczymy, jak można odtwarzać i wyświetlać dane, a następnie zajmiemy sięsposobami określania nazw kolumn i innych informacji o danych.W nowszych wersjach MySQL dostępna jest funkcja mysql_field_client, która odnosi się doobiektu połączenia i zwraca liczbę pól w zestawie wynikowym:unsigned int mysql_field_count(MYSQL *connection);Ta funkcja może być także wykorzystana do bardziej ogólnego przetwarzania, np.do określania,czy przy wywołaniu mysql_store_result wystąpił błąd.Jeżeli mysql_store_result zwróciNULL, ale funkcja mysql_field_count zwraca liczbę większą od zera, to możemy być pewni, żew zestawie wynikowym są jakieś dane, chociaż wystąpił błąd przy ich odtwarzaniu.Jeżeli jednakfunkcja mysql_field_count zwraca zero, to nie ma żadnych kolumn do pobrania, a zatempróba zachowania wyniku nie uda się.Prawdopodobnie taka metoda będzie częściej stosowana wówczas, gdy polecenie SQL nie jestznane z góry albo gdy programista chce utworzyć moduł przeznaczony do całkowicie ogólnegoprzetwarzania zapytań.W programach wykorzystujących starsze wersje MySQL można spotkać wywołania funkcjimysql_num_fields.Posługują się one wskaznikami struktury połączenia lub struktury wynikówi zwracają liczbę wierszy.W nowszych programach należy w zasadzie używać funkcji mysql_field_count, chyba żeprogram ma współpracować ze starszą wersją MySQL.Jeżeli chcemy po prostu otrzymać informację w postaci niesformatowanego tekstu i wiemy, w jakisposób bezpośrednio wyświetlić dane, to możemy wykorzystać strukturę MYSQL_ROW zwracanąprzez funkcję mysql_fetch_row.Dodamy więc do naszego programu select2.c prostąfunkcję display_row wyświetlającą dane.Zwróćmy uwagę na to, że w celu uproszczenia programu struktura połączenia, struktura wynikówi informacja zwracana przez funkcję mysql_fetch_row mają charakter globalny.W kodzieprodukcyjnym nie zalecamy takiego podejścia [ Pobierz całość w formacie PDF ]