在 Linux 系統上開發 C++ 應用程式時,存取 MySQL 資料庫是常見需求。本文將詳細說明從安裝 MySQL、設定開發環境、建立測試資料表,到撰寫 C++ 程式碼執行插入、更新、呼叫預存程序、觸發器以及查詢資料等完整流程,並提供完整的編譯與執行指令。
以 Red Hat/CentOS 系列為例,掛載安裝光碟並安裝核心套件:
mkdir /cdrom
mount /dev/hdc /cdrom
cd /cdrom/Server
rpm -ivh perl-DBI-1.52-2.el5.i386.rpm
rpm -ivh mysql-5.0.45-7.el5.i386.rpm mysql-bench-5.0.45-7.el5.i386.rpm mysql-devel-5.0.45-7.el5.i386.rpm
rpm -ivh perl-DBD-MySQL-3.0007-2.el5.i386.rpm
rpm -ivh mysql-server-5.0.45-7.el5.i386.rpm mysql-test-5.0.45-7.el5.i386.rpm
啟動服務並驗證連線:
service mysqld start
mysql
rpm -ivh gcc* --force --nodeps
CREATE TABLE t1 (id INT, name VARCHAR(30));
// 1.cpp
#include <iostream>
#include <mysql/mysql.h>
#include <string>
using namespace std;
int main() {
MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, "localhost", "root", "root", "test", 3306, NULL, 0)) {
cerr << "連線失敗: " << mysql_error(&mysql) << endl;
return 1;
}
string sql = "INSERT INTO t1 (id, name) VALUES (1, 'java1');";
if (mysql_query(&mysql, sql.c_str())) {
cerr << "插入失敗: " << mysql_error(&mysql) << endl;
}
mysql_close(&mysql);
return 0;
}
編譯指令:
g++ -o 1.out 1.cpp -lmysqlclient -I/usr/include/mysql/ -L/usr/lib/mysql
// 2.cpp
#include <iostream>
#include <mysql/mysql.h>
#include <string>
using namespace std;
int main() {
MYSQL mysql;
mysql_init(&mysql);
mysql_real_connect(&mysql, "localhost", "root", "root", "test", 3306, NULL, 0);
string sql = "INSERT INTO t1 (id, name) VALUES (2, 'java2'), (3, 'java3');";
mysql_query(&mysql, sql.c_str());
sql = "UPDATE t1 SET name = 'java33' WHERE id = 3;";
mysql_query(&mysql, sql.c_str());
mysql_close(&mysql);
return 0;
}
在 MySQL 客戶端中建立:
DELIMITER //
CREATE PROCEDURE p01()
BEGIN
INSERT INTO t1 (id, name) VALUES (66, 'java66');
END //
DELIMITER ;
C++ 呼叫:
// 3.cpp
#include <iostream>
#include <string>
#include <mysql/mysql.h>
using namespace std;
int main() {
MYSQL mysql;
mysql_init(&mysql);
mysql_real_connect(&mysql, "localhost", "root", "root", "test", 3306, NULL, 0);
string sql = "CALL p01();";
mysql_query(&mysql, sql.c_str());
mysql_close(&mysql);
return 0;
}
CREATE TABLE t2 (id INT, name VARCHAR(30));
DELIMITER //
CREATE TRIGGER tr1 AFTER INSERT ON t1
FOR EACH ROW
BEGIN
INSERT INTO t2 (id, name) VALUES (NEW.id, NEW.name);
END //
DELIMITER ;
// 4.cpp
#include <iostream>
#include <string>
#include <mysql/mysql.h>
using namespace std;
int main() {
MYSQL mysql;
MYSQL_RES *result = NULL;
mysql_init(&mysql);
mysql_real_connect(&mysql, "localhost", "root", "root", "test", 3306, NULL, 0);
string sql = "SELECT id, name FROM t1;";
mysql_query(&mysql, sql.c_str());
result = mysql_store_result(&mysql);
int rowcount = mysql_num_rows(result);
cout << "總筆數: " << rowcount << endl;
mysql_close(&mysql);
return 0;
}
// 5.cpp
// ... 前略 ...
int fieldcount = mysql_num_fields(result);
cout << "欄位數: " << fieldcount << endl;
// ... 後略 ...
// 6.cpp
// ... 前略 ...
MYSQL_FIELD *field = NULL;
for (int i = 0; i < fieldcount; i++) {
field = mysql_fetch_field_direct(result, i);
cout << field->name << "\t\t";
}
cout << endl;
// ... 後略 ...
// 7.cpp
// ... 前略 ...
MYSQL_ROW row = NULL;
row = mysql_fetch_row(result);
while (NULL != row) {
for (int i = 0; i < fieldcount; i++) {
cout << row[i] << "\t\t";
}
cout << endl;
row = mysql_fetch_row(result);
}
// ... 後略 ...
mysql-devel 套件已安裝,否則編譯時會找不到 mysql/mysql.h。mysql_query 後建議檢查回傳值,若非 0 即表示錯誤,可用 mysql_error() 取得詳細訊息。mysql_store_result 後務必配合 mysql_free_result 釋放記憶體(範例為簡化省略)。透過上述步驟,您已能在 Linux 上完整部署 MySQL 並以 C++ 進行資料庫操作。實務上建議進一步封裝連線池、參數化查詢(Prepared Statements)與錯誤處理機制,以提升安全性與穩定性。