首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C/C++ 調用 MySQL 預存程序完整實戰教程

     編輯:更多程式設計知識

MySQL 5.0+ 支援預存程序,將複雜 SQL 邏輯封裝於資料庫層,C/C++ 僅需呼叫 CALL 語句並處理輸出參數,實現業務邏輯與資料存取分離,大幅降低客戶端代碼複雜度。

資料庫準備:建表、資料與預存程序

-- 1. 建表
CREATE TABLE student (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(20),
  age TINYINT,
  remark VARCHAR(50)
);

-- 2. 插入測試資料
INSERT INTO student VALUES (1, 'zhouys', 90, '');

-- 3. 建立預存程序:依 id 查詢學生資訊
DELIMITER //
CREATE PROCEDURE querystudent(
  IN in_id INT,
  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; LEAVE label_a;
  END IF;
  SELECT name, age INTO v_name, v_age FROM student WHERE id = in_id;
  IF v_name IS NULL 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 ;

C 語言調用五大步驟

  1. 初始化句柄:mysql_init(&mysql)
  2. 連線資料庫:mysql_real_connect(&mysql, "localhost", "root", "", "billingdb", 0, NULL, CLIENT_MULTI_STATEMENTS) — 必須啟用 CLIENT_MULTI_STATEMENTS 支援多語句。
  3. 呼叫預存程序:mysql_real_query(&mysql, "CALL querystudent(1, @ret, @out_name, @out_age)", ...)
  4. 查詢輸出參數:mysql_query(&mysql, "SELECT @ret, @out_name, @out_age") → mysql_store_result() 取得結果集。
  5. 讀取並釋放:mysql_fetch_row() 逐行讀取 → mysql_free_result() → mysql_close()。

關鍵代碼片段

// 3. 呼叫
strcpy(query, "CALL querystudent(1, @ret, @out_name, @out_age)");
ret = mysql_real_query(&mysql, query, (unsigned int)strlen(query));

// 4. 取得輸出參數
mysql_query(&mysql, "SELECT @ret, @out_name, @out_age");
results = mysql_store_result(&mysql);

// 5. 解析結果
while ((record = mysql_fetch_row(results))) {
  printf("[%s]-[%s]-[%s]\n", record[0], record[1], record[2]);
}
mysql_free_result(results);
mysql_close(&mysql);

常見坑與經驗總結

  • 輸出參數綁定:C/C++ 無法像 C# 直接綁定 OUT 參數,必須透過 SELECT @param 二次查詢獲取。
  • 多結果集:若預存程序內有多個 SELECT,需循環呼叫 mysql_next_result() 處理每個結果集。
  • 準備語句限制:mysql_stmt_prepare 綁定 OUT 參數在某些版本會報錯 Error 1414,建議採用上述 CALL + SELECT @var 模式。
  • 字元集:連線前設定 mysql_set_character_set(&mysql, "utf8") 避免中文亂碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved