| 功能 | API 函數 | 返回值 |
| 執行 SQL | mysql_query(conn, sql) | 0 成功,非 0 失敗 |
| 二進位數據 | mysql_real_query(conn, sql, len) | 同 mysql_query |
| 影響行數 | mysql_affected_rows(conn) | my_ulonglong (%lu) |
| 獲取結果集 | mysql_store_result / mysql_use_result | MYSQL_RES* |
| 逐行讀取 | mysql_fetch_row(result) | MYSQL_ROW (字串陣列) |
| 釋放結果 | mysql_free_result(result) | void |
增刪改操作範例
int execute_sql(MYSQL *conn, const char *sql, const char *op) {
if (mysql_query(conn, sql)) {
fprintf(stderr, "%s 失敗: [%d] %s\n", op, mysql_errno(conn), mysql_error(conn));
return -1;
}
printf("%s 成功,影響 %lu 行\n", op, (unsigned long)mysql_affected_rows(conn));
return 0;
}
// 使用示例
execute_sql(conn, "INSERT INTO student(id,name) VALUES('1001','Alice')", "插入");
execute_sql(conn, "UPDATE student SET name='Bob' WHERE id='1001'", "更新");
execute_sql(conn, "DELETE FROM student WHERE id='1001'", "刪除");
查詢結果集處理:兩種模式對比
模式一:mysql_store_result (一次性載入客戶端)
MYSQL_RES *res = mysql_store_result(conn);
if (res) {
unsigned long rows = mysql_num_rows(res);
printf("共 %lu 行\n", rows);
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
for (int i = 0; i < mysql_num_fields(res); i++) {
printf("%s\t", row[i] ? row[i] : "NULL");
}
puts("");
}
mysql_free_result(res);
}
特點:支援 mysql_data_seek 隨機訪問、mysql_num_rows 獲取總行數,適合小結果集。
模式二:mysql_use_result (流式逐行讀取)
MYSQL_RES *res = mysql_use_result(conn);
if (res) {
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
// 處理單行,不可 seek,不可獲取總行數
}
mysql_free_result(res);
}
特點:記憶體佔用低、網絡負載均衡,適合大結果集串流處理。
結果集元數據解析
MYSQL_FIELD *field;
while ((field = mysql_fetch_field(res))) {
printf("欄位: %-15s 表: %-10s 類型: %d 長度: %u 旗標: %u\n",
field->name, field->table, field->type, field->length, field->flags);
if (IS_NUM(field->type)) puts(" -> 數值型");
if (field->flags & PRI_KEY_FLAG) puts(" -> 主鍵");
if (field->flags & AUTO_INCREMENT_FLAG) puts(" -> 自增");
}
常用類型常數:FIELD_TYPE_LONG、FIELD_TYPE_VAR_STRING、FIELD_TYPE_DECIMAL 等 (定義於 mysql_com.h)。
完整查詢範例:顯示表頭與數據
void print_result(MYSQL *conn, MYSQL_RES *res) {
MYSQL_FIELD *field;
MYSQL_ROW row;
// 列印表頭
printf("欄位詳情:\n");
while ((field = mysql_fetch_field(res))) {
printf("\tName: %s\n\tTable: %s\n\tType: ", field->name, field->table);
if (IS_NUM(field->type)) printf("Numeric\n");
else {
switch(field->type) {
case FIELD_TYPE_VAR_STRING: printf("VARCHAR\n"); break;
case FIELD_TYPE_LONG: printf("LONG\n"); break;
default: printf("Type %d\n", field->type);
}
}
printf("\tMax width: %ld\n", field->length);
if (field->flags & AUTO_INCREMENT_FLAG) printf("\tAuto increment\n");
puts("");
}
// 列印數據
mysql_data_seek(res, 0); // 重置指針 (僅 store_result 支援)
while ((row = mysql_fetch_row(res))) {
for (int i = 0; i < mysql_num_fields(res); i++) {
printf("%s ", row[i] ? row[i] : "NULL");
}
puts("");
}
}
編譯鏈接參數
gcc -I/usr/include/mysql crud_demo.c -L/usr/lib/mysql -lmysqlclient -o crud_demo
- 上一篇文章: Linux C 語言連接 MySQL 完整開發指南
- 下一篇文章: CentOS 部署 MariaDB 完整指南:從安裝到資料目錄遷移
Copyright ©
程式碼之家 All Rights Reserved