[ Pobierz całość w formacie PDF ]
.W nowszych programach nale¿y w zasadzie u¿ywaæ funkcji mysql_field_count, chyba¿e program ma wspó³pracowaæ ze starsz¹ wersj¹ MySQL.Je¿eli chcemy po prostu otrzymaæ informacjê w postaci niesformatowanego tekstui wiemy, w jaki sposób bezpoœrednio wyœwietliæ dane, to mo¿emy wykorzystaæstrukturê MYSQL_ROW zwracan¹ przez funkcjê mysql_fetch_row.Dodamy wiêc donaszego 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ów i informacja zwracana przez funkcjê mysql_fetch_row maj¹charakter globalny.W kodzie produkcyjnym nie zalecamy takiego podejœcia.Oto jak wygl¹da nasza prosta funkcja wyœwietlaj¹ca dane:void display_row() {unsigned int field_count;field_count = 0;while (field_count < mysql_field_count(&my_connection)) {printf("%s ", sqlrow[field_count]};field_count++;}printf("\n");}Dodamy j¹ do programu select.c oraz do³¹czymy jej deklaracjê i wywo³anie:void display_row();intmsin(int argc, char *argv[]) {int res;mysql_init(&mysql_real_connect(&my_connection, "localhost", "rick","bar, "rick", 0, NULL, 0)) {printf("Connection success\n");res = mysql_query(&my_connection, "SELECT childno, fname,age FROM children WHERE age > 5");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");display_row();}Nowy program nazwiemy select3.c.Nastêpnie skompilujemy go i uruchomimy:$ gcc -I/usr/include/mysql select3.c -L/usr/lib/mysql -lmysqlclient -o select3$./select3Connection successFetched data.1 Jenny 14Fetched data.2 Andrew 10Fetched data.6 Alex 11$Jak widaæ, wszystko dzia³a prawid³owo, chocia¿ formatowanie wyników jest bardzoograniczone.Nie braliœmy pod uwagê mo¿liwych wartoœci NULL w zwracanychwynikach.Je¿eli trzeba np.przedstawiæ dane w postaci tabelarycznej, to nale¿yuzyskaæ zarówno dane, jak i informacje dodatkowe o tych danych w nieco innejpostaci.W jaki sposób mamy to zrobiæ?Zamiast korzystania z obiektu bêd¹cego wierszem (zdefiniowanego jako char **),który jest zwracany przez mysql_fetch_row, mo¿emy pobieraæ informacjê w postacipojedynczych pól do struktury zwieraj¹cej zarówno dane, jak i metadane.Wykonuje to funkcja mysql_fetch_field:MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);Nale¿y powtarzaæ wywo³ania tej funkcji wielokrotnie, przechodz¹c po kolei przezwszystkie pola.Je¿eli nie bêdzie ju¿ ¿adnych pól do przetworzenia, to funkcjazwróci wartoœæ NULL.WskaŸnik zwróconej struktury pola mo¿e byæ tak¿ewykorzystany do uzyskania ró¿nych informacji o kolumnie przechowywanej w tejstrukturze.Definicja tej struktury jest podana w pliku mysql.h:Pole w strukturze MYSQL_FIELDZnaczeniechar *name;Nazwa kolumny jako napis.char *table;Nazwa tabeli, z której pochodzi kolumna.Przydaje siê, gdy dane s¹ pobierane zwiêkszej liczby tabel.Nale¿y pamiêtaæ, ¿e dla wyliczanych wartoœci (np.MAX)jako nazwê tabeli otrzymujemy pusty napis.char *def;Jeœli wywo³amy funkcjê mysql_list_fields (która nie jest tu opisana), to poledef bêdzie zawiera³o wartoœæ domyœln¹ dla kolumny.enum enum_field_types type;Typ wartoœci w kolumnie.Patrz ni¿ej.unsigned int length;Szerokoœæ kolumny okreœlona przy definiowaniu tabeli.unsigned int max_length;Jeœli u¿yjemy funkcji mysql_store_result, to pole max_length bêdzie zawieraærzeczywist¹ znalezion¹ najwiêksz¹ szerokoœæ kolumny.Pole to nie jest ustawianeprzy wywo³aniu mysql_use_result.unsigned int flags;Znaczniki informuj¹ce o definicji kolumny, a nie o faktycznie znalezionychdanych.Najczêœciej s¹ to: NOT_NULL_FLAG, PRI_KEY_FLAG, UNSIGNED_FLAG,AUTO_INCREMENT_FLAG, BINARY_FLAG.Pe³ny spis znajduje siê w dokumentacji.unsigned int decimals;Liczba miejsc dziesiêtnych, wa¿na tylko w polach liczbowych.Zakres typów kolumn jest bardzo szeroki.Pe³na lista jest podana w plikumysql_com.h i w dokumentacji
[ Pobierz całość w formacie PDF ]