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

Linux 環境下使用 C++ 連接與操作 MySQL 資料庫完整指南

     編輯:關於C語言

前言

在 Linux 系統上開發 C++ 應用程式時,存取 MySQL 資料庫是常見需求。本文將詳細說明從安裝 MySQL、設定開發環境、建立測試資料表,到撰寫 C++ 程式碼執行插入、更新、呼叫預存程序、觸發器以及查詢資料等完整流程,並提供完整的編譯與執行指令。

一、安裝 MySQL 伺服器與開發套件

以 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

二、安裝 GCC 編譯工具鏈

rpm -ivh gcc* --force --nodeps

三、建立測試資料表與資料

CREATE TABLE t1 (id INT, name VARCHAR(30));

四、C++ 程式設計範例

1. 基本插入資料

// 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. 批次插入與更新資料

// 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;
}

3. 建立與呼叫預存程序

在 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;
}

4. 建立觸發器同步資料

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 ;

5. 查詢資料筆數

// 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;
}

6. 查詢欄位數

// 5.cpp
// ... 前略 ...
int fieldcount = mysql_num_fields(result);
cout << "欄位數: " << fieldcount << endl;
// ... 後略 ...

7. 列出欄位名稱

// 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;
// ... 後略 ...

8. 顯示所有資料內容

// 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)與錯誤處理機制,以提升安全性與穩定性。

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