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

MySQL C API 開發學生信息管理系統實戰(基於嵌入式 mysqld)

     編輯:MySQL 綜合教學

MySQL C API 開發學生信息管理系統:嵌入式 mysqld 實戰指南

MySQL 提供嵌入式服務器庫,允許在客戶端應用中直接運行功能完整的 MySQL 服務器,無需獨立進程通信,顯著降低延遲並簡化部署。本文基於 Fedora 8 環境,使用 C 語言調用 MySQL C API 實現學生信息的增刪改查完整流程。

一、嵌入式 MySQL 架構優勢

  • 零網絡開銷:進程內直接調用,避免 TCP/IP 協議棧開銷。
  • 部署極簡:無需單獨安裝、配置、啟動 mysqld 服務。
  • 語言綁定:僅支持 C/C++,其他語言需通過 FFI 或獨立服務模式。

二、核心 API 調用流程

// 1. 初始化 MySQL 庫
mysql_library_init(0, NULL, NULL);  // 等效 mysql_server_init()

// 2. 初始化連接句柄
MYSQL *mysql = mysql_init(NULL);

// 3. 連接嵌入式服務器(參數多為 NULL/空字符串)
mysql_real_connect(mysql, NULL, "root", "password", "testdb", 0, NULL, 0);

// 4. 執行 SQL
mysql_real_query(mysql, "SELECT * FROM student", strlen(sql));

// 5. 獲取結果集
MYSQL_RES *res = mysql_store_result(mysql);  // 一次性獲取全量結果
// 或 mysql_use_result(mysql);  // 流式逐行獲取,適合大結果集

// 6. 遍歷行
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
    // row[0]..row[n-1] 為各字段值
}

// 7. 釋放資源
mysql_free_result(res);
mysql_close(mysql);
mysql_library_end();  // 停止嵌入式服務器

三、關鍵 API 對比:store_result vs use_result

特性mysql_store_resultmysql_use_result
內存佔用高(全量緩存客戶端)低(單行緩衝)
隨機訪問支持(mysql_data_seek)不支持(僅順序)
獲取總行數mysql_num_rows 即時可用需遍歷完才知
適用場景中小結果集、需多次遍歷大結果集、串流處理

四、學生信息管理核心模塊代碼

1. 顯示表數據

void Show(char *Table_Name) {
    char sql[100];
    sprintf(sql, "SELECT * FROM %s", Table_Name);
    mysql_real_query(mysql, sql, strlen(sql));
    MYSQL_RES *res = mysql_store_result(mysql);
    
    // 打印列名
    MYSQL_FIELD *field;
    while ((field = mysql_fetch_field(res)))
        printf("%s\t\t", field->name);
    printf("\n");
    
    // 打印行
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res))) {
        for (int i = 0; i < mysql_num_fields(res); i++)
            printf("%s\t\t", row[i] ? row[i] : "NULL");
        printf("\n");
    }
    mysql_free_result(res);
}

2. 插入記錄

void Insert(char *Table_Name) {
    char name[20], id[20], math[10], chinese[10], sql[200];
    printf("請輸入名字:"); scanf("%s", name);
    printf("請輸入學號:"); scanf("%s", id);
    printf("請輸入數學成績:"); scanf("%s", math);
    printf("請輸入語文成績:"); scanf("%s", chinese);
    
    sprintf(sql, "INSERT INTO %s VALUES('%s','%s','%s','%s')", 
            Table_Name, name, id, math, chinese);
    mysql_real_query(mysql, sql, strlen(sql));
    printf("添加成功!\n");
}

3. 刪除記錄

void Delete(char *Table_Name) {
    char delName[20], sql[100];
    printf("請輸入要刪除的名字:"); scanf("%s", delName);
    sprintf(sql, "DELETE FROM %s WHERE name='%s'", Table_Name, delName);
    mysql_real_query(mysql, sql, strlen(sql));
    printf("刪除成功!\n");
}

4. 查詢記錄

void Find(char *Table_Name) {
    char findName[20], sql[100];
    printf("請輸入查詢名字:"); scanf("%s", findName);
    sprintf(sql, "SELECT * FROM %s WHERE name='%s'", Table_Name, findName);
    mysql_real_query(mysql, sql, strlen(sql));
    MYSQL_RES *res = mysql_store_result(mysql);
    
    MYSQL_FIELD *field;
    while ((field = mysql_fetch_field(res)))
        printf("%s\t\t", field->name);
    printf("\n");
    
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res))) {
        for (int i = 0; i < mysql_num_fields(res); i++)
            printf("%s\t\t", row[i] ? row[i] : "NULL");
        printf("\n");
    }
    mysql_free_result(res);
}

五、編譯與鏈接

gcc -o student_mgr student_mgr.c \
    -I/usr/include/mysql \
    -L/usr/lib/mysql \
    -lmysqld -lpthread -lm -lrt -ldl

注意:鏈接嵌入式庫使用 -lmysqld,而非客戶端庫 -lmysqlclient。

六、錯誤處理最佳實踐

if (mysql_errno(mysql)) {
    fprintf(stderr, "Error %d: %s\n", mysql_errno(mysql), mysql_error(mysql));
    // 釋放資源並退出
}

嵌入式 MySQL 適用於桌面應用、邊緣設備、測試工具等輕量級場景。生產級高併發服務仍建議採用獨立 Server 架構,利用連接池、讀寫分離、集群化提升可用性與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved