首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 呼叫 MySQL 預存程序完整指南:建立資料表、預存程式與 C 介面呼叫流程

     編輯:關於C++

為什麼使用預存程序?

  • 封裝複雜資料庫邏輯,減少 C 程式碼與 SQL 混雜。
  • 前端邏輯與資料庫處理分離,利於維護與安全。
  • 減少網路往返,提升效能。

完整範例流程

1. 建立資料表與測試資料

CREATE TABLE student(
    id INT AUTO_INCREMENT,
    name VARCHAR(20),
    age TINYINT,
    remark VARCHAR(50),
    PRIMARY KEY(id)
);

INSERT INTO student VALUES(1, 'zhouys', 90, '');
COMMIT;

2. 建立預存程序 querystudent

DELIMITER //
CREATE PROCEDURE querystudent(
    IN in_id INT,          -- 0:用名字查, 1:用id查
    OUT out_ret INT,       -- 回傳碼
    OUT out_name VARCHAR(20),
    OUT out_age INT
)
label_a: BEGIN
    DECLARE v_name VARCHAR(20);
    DECLARE v_age TINYINT;

    IF (in_id <= 0) THEN
        SET out_ret = -1;  -- id錯誤
        LEAVE label_a;
    END IF;

    SELECT name, age INTO v_name, v_age FROM student WHERE id = in_id;
    IF (ROW_COUNT() == 0) THEN
        SET out_ret = -2;  -- 找不到
        LEAVE label_a;
    END IF;

    SET out_ret = 0;
    SET out_name = v_name;
    SET out_age = v_age;
END //
DELIMITER ;

3. C 語言呼叫步驟

MYSQL mysql;
mysql_init(&mysql);

if (!mysql_real_connect(&mysql, "localhost", "root", "", "billingdb", 0, NULL, CLIENT_MULTI_STATEMENTS)) {
    // 連線失敗處理
}

char query[256];
strcpy(query, "CALL querystudent(1, @ret, @out_name, @out_age)");
mysql_real_query(&mysql, query, strlen(query));

// 取得 OUT 參數
mysql_query(&mysql, "SELECT @ret, @out_name, @out_age");
MYSQL_RES *res = mysql_store_result(&mysql);
MYSQL_ROW row = mysql_fetch_row(res);
printf("ret=%s, name=%s, age=%s\n", row[0], row[1], row[2]);

mysql_free_result(res);
mysql_close(&mysql);

關鍵 API 流程圖

  1. mysql_init:初始化連線控制結構。
  2. mysql_real_connect:建立實際連線,需指定 CLIENT_MULTI_STATEMENTS 支援多重陳述式。
  3. mysql_real_query:執行 CALL 預存程序。
  4. mysql_query("SELECT @out_..."):查詢用戶變數取得 OUT 參數值。
  5. mysql_store_result / mysql_fetch_row:讀取結果集。
  6. mysql_free_result / mysql_close:釋放資源。

進階議題:C++ Prepared Statement 綁定 OUT 參數失敗

嘗試用 mysql_stmt_bind_param 綁定 OUT 參數會報錯:Error 1414: OUT argument is not a variable。MySQL C API 目前對預存程序 OUT 參數的 Prepared Statement 支援有限,建議採用上述「CALL + SELECT @變數」模式,或使用 MySQL++ 等封裝庫。

實務心得

  • 預存程序內部邏輯盡量完整,減少應用層判斷。
  • 錯誤碼設計要清楚(如 -1 參數錯、-2 無資料、0 成功)。
  • 連線參數(主機、帳號、密碼、資料庫)建議外部化配置檔。
  • 交易控制(COMMIT/ROLLBACK)視業務決定放在預存程序或應用層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved