調用 mysql_query() 成功後,mysql_store_result() 返回 NULL 並不一定意味著錯誤,必須結合 mysql_field_count() 判斷。
malloc() 失敗INSERT/UPDATE/DELETE 等不返回結果集的語句MYSQL_RES *result = mysql_store_result(&mysql);
if (result) {
// 有結果集:SELECT/SHOW/DESC 等
unsigned int num_fields = mysql_num_fields(result);
// 遍歷行數據...
mysql_free_result(result);
} else {
// NULL 分支:必須檢查 field_count
if (mysql_field_count(&mysql) == 0) {
// 確認為非查詢語句
unsigned long long affected = mysql_affected_rows(&mysql);
printf("Affected rows: %llu\n", affected);
} else {
// 真正的錯誤:內存不足或網絡異常
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
}
| 函數 | 用途 | 關鍵點 |
|---|---|---|
| mysql_field_count() | 結果集列數 | 0 = 無結果集語句;>0 = 應有結果集但獲取失敗 |
| mysql_affected_rows() | 影響行數 | 僅對 INSERT/UPDATE/DELETE 有效 |
| mysql_errno()/mysql_error() | 錯誤碼/信息 | 區分真錯誤與正常無結果集 |
| mysql_num_fields() | 結果集列數 | 需在 result 非 NULL 時調用 |
誤區:SELECT 查無數據時 result 為 NULL。
事實:rowcount=0時 result 依然有效(指向空結果集),只有非查詢語句或真錯誤才返回 NULL。
mysql_store_result:一次性讀取全部結果到客戶端緩存,佔用客戶端內存,釋放服務器資源快,支持隨機訪問(mysql_data_seek)mysql_use_result:流式讀取,逐行從服務器拉取,客戶端內存佔用小,但佔用服務器資源久,讀取期間不能執行其他查詢正確處理 NULL 返回值,是編寫健壯 MySQL C API 應用的基礎技能。