首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux C 語言操作 MySQL 增刪改查完整實戰

     編輯:MySQL 綜合教學

核心 API 概覽

增刪改操作範例


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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
功能API 函數返回值
執行 SQLmysql_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_resultMYSQL_RES*
逐行讀取mysql_fetch_row(result)MYSQL_ROW (字串陣列)
釋放結果mysql_free_result(result)void