可以從SELECT語句(或其他返回數(shù)據(jù)的語句)中檢索完所有數(shù)據(jù),在單一調(diào)用中,使用mysql_store_result:
MYSQL_RES *mysql_store_result(MYSQL *connection);
必須在mysql_query檢索數(shù)據(jù)后才能調(diào)用這個函數(shù),以在結(jié)果集中存儲該數(shù)據(jù)。這個函數(shù)從服務(wù)器中檢索所有數(shù)據(jù)并立即將它存儲在客戶機(jī)中。它返回一個指向以前我們從未遇到過的結(jié)構(gòu)(結(jié)果集結(jié)構(gòu))的指針。如果語句失敗,則返回NULL。
使用等價的PostgreSQL時,應(yīng)該知道返回NULL意味著已經(jīng)發(fā)生了錯誤,并且這與未檢索到數(shù)據(jù)的情況不同。即使,返回值不是NULL,也不意味著當(dāng)前有數(shù)據(jù)要處理。
如果未返回NULL,則可以調(diào)用mysql_num_rows并且檢索實際返回的行數(shù),它當(dāng)然可能是0。
my_ulonglong mysql_num_rows(MYSQL_RES *result);
它從mysql_store_result取得返回的結(jié)果結(jié)構(gòu),并且在該結(jié)果集中返回行數(shù),行數(shù)可能為0。如果mysql_store_result成功,則mysql_num_rows也總是成功的。
這
種mysql_store_result和mysql_num_rows的組合是檢索數(shù)據(jù)的一種簡便并且直接的方法。一旦
mysql_store_result成功返回,則所有查詢數(shù)據(jù)都已經(jīng)存儲在客戶機(jī)上并且我們知道可以從結(jié)果結(jié)構(gòu)中檢索它,而不用擔(dān)心會發(fā)生數(shù)據(jù)庫或網(wǎng)絡(luò)
錯誤,因為對于程序所有數(shù)據(jù)都是本地的。還可以立即發(fā)現(xiàn)返回的行數(shù),它可以使編碼更簡便。如前所述,它將所有結(jié)果立即地發(fā)送回客戶機(jī)。對于大結(jié)果集,它可
能耗費大量的服務(wù)器、網(wǎng)絡(luò)和客戶機(jī)資源。由于這些原因,使用更大的數(shù)據(jù)集時,最好僅檢索需要的數(shù)據(jù)。不久,我們將討論如何使用
mysql_use_result函數(shù)來完成該操作。
一旦檢索了數(shù)據(jù),則可以使用mysql_fetch_row來檢索它,并且使用mysql_data_seek、mysql_row_seek、mysql_row_tell操作結(jié)果集。在開始檢索數(shù)據(jù)階段之前,讓我們先討論一下這些函數(shù)。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
這個函數(shù)采用從存儲結(jié)果中獲取的結(jié)果結(jié)構(gòu),并且從中檢索單一行,在行結(jié)構(gòu)中返回分配給您的數(shù)據(jù)。當(dāng)沒有更多數(shù)據(jù)或者發(fā)生錯誤時,返回NULL。稍后,我們將回來處理這一行中的數(shù)據(jù)。
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
這個函數(shù)允許您進(jìn)入結(jié)果集,設(shè)置將由下一個獲取操作返回的行。offset是行號,它必須在從0到結(jié)果集中的行數(shù)減 1 的范圍內(nèi)。傳遞0將導(dǎo)致在下一次調(diào)用mysql_fetch_row時返回第一行。
MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result);
這個函數(shù)返回一個偏移值,它表示結(jié)果集中的當(dāng)前位置。它不是行號,不能將它用于mysql_data_seek。但是,可將它用于:
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
它移動結(jié)果集中的當(dāng)前位置,并返回以前的位置。
有時,這一對函數(shù)對于在結(jié)果集中的已知點之間跳轉(zhuǎn)很有用。請注意,不要將row tell和row seek使用的偏移值與data_seek使用的行號混淆。這些是不可交換的,結(jié)果將是您所希望看到的。
void mysql_free_result(MYSQL_RES *result);
完成結(jié)果集時, 必須總是調(diào)用這個函數(shù),以允許MySQL庫整理分配給它的對象。
|
|