一、連接數據庫基礎
1. 頭文件與庫文件
連接 MySQL 需包含的頭文件:
#include <mysql/mysql.h>
// 部分環境也可用 #include <mysql.h>
編譯鏈接時,Linux 平臺需指定庫名:-lmysqlclient
?,用于鏈接 MySQL 客戶端函數庫。
2. 初始化連接句柄
MYSQL *mysql_init(MYSQL *mysql);
- 功能:初始化 MySQL 連接句柄。若參數為?
NULL
,會分配新的連接句柄并返回其指針;若參數是已有的結構,會重新初始化 。 - 返回值:成功返回連接句柄指針,出錯返回?
NULL
?。
3. 連接數據庫
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user, const char *passwd,const char *db, unsigned int port,const char *unix_socket,unsigned long clientflag);
- 參數說明:
mysql
:mysql_init
?初始化后返回的連接句柄指針。host
:主機名或 IP 地址,本地可填?"localhost"
、"127.0.0.1"
?或空字符串、NULL
?。user
:數據庫用戶名,如管理員用戶?root
?。passwd
:用戶密碼 。db
:要連接的數據庫名 。port
:數據庫端口,默認?3306
,填?0
?則用默認端口 。unix_socket
:一般填?NULL
,表示不使用 Unix 套接字或管道 。clientflag
:標志位,通常填?0
?。
- 返回值:成功返回與第一個參數相同的連接句柄指針,失敗返回?
NULL
?。
4. 關閉連接
void mysql_close(MYSQL *mysql);
功能:關閉 MySQL 連接,釋放相關資源,不再使用連接時調用。
二、SQL 語句執行與結果處理
1. 執行 SQL 語句
int mysql_query(MYSQL *mysql, const char *q);
- 參數:
mysql
:連接成功后的句柄指針。q
:要執行的 SQL 語句,末尾可不帶分號(與命令行工具使用有區別 )。
- 返回值:成功返回?
0
;若 SQL 語句含二進制數據,建議用?mysql_real_query
?。
2. 提取結果
MYSQL_RES *mysql_store_result(MYSQL *mysql); // 一次性提取所有結果數據
// MYSQL_RES *mysql_use_result(MYSQL *mysql); // 一次提取一行數據(按需獲取,適合大數據量)
- 功能:
mysql_query
?成功執行后調用,mysql_store_result
?會把結果集全部加載到客戶端內存,返回指向結果集結構的指針;mysql_use_result
?按需獲取數據,更節省內存,但需按行讀取并及時處理 。 - 返回值:成功返回結果集指針,失敗返回?
NULL
?。
3. 獲取結果集行數
uint64_t mysql_num_rows(MYSQL_RES *res);
- 說明:需在執行?
mysql_store_result
?后調用,用于獲取結果集中記錄的行數,無返回行則為?0
?。
4. 取出結果集一行記錄
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 功能:從結果集中取出一行,存儲到行結構中。數據處理完或出錯時返回?
NULL
,常配合循環遍歷結果集 。
5. 查看記錄行列數
unsigned int mysql_field_count(MYSQL *mysql);
功能:獲取結果集中一行記錄的列數 。
6. 釋放結果集內存
void mysql_free_result(MYSQL_RES *result);
功能:處理完結果集后調用,釋放結果集占用的內存空間 。
7. 獲取錯誤信息
unsigned int mysql_errno(MYSQL *mysql); // 返回錯誤碼
const char *mysql_error(MYSQL *mysql); // 返回錯誤信息描述
- 功能:執行操作出錯時,可調用獲取錯誤碼和詳細錯誤描述,用于調試排查問題 。
8. 簡單示例
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>int main()
{MYSQL mysql;if (mysql_init(&mysql) == NULL){printf("mysql init err\n");return 0;}if (mysql_real_connect(&mysql, "localhost", "root", "123456", "testdb", 3306, NULL, 0) == NULL){printf("connect mysql failed\n");return 0;}printf("connect mysql success\n");// char* sql = "insert into student2 values(6,'小王')";char* sql = "select * from student2";int query_res = mysql_query(&mysql, sql);if (query_res != 0){printf("query err:%s\n", mysql_error(&mysql));return 0;}// MYSQL_RES * mysql_res =mysql_use_result(&mysql);MYSQL_RES * mysql_res = mysql_store_result(&mysql);if (mysql_res == NULL){printf("result err:%s\n", mysql_error(&mysql));return 0;}// 判斷返回的行數int num = mysql_num_rows(mysql_res);if (num == 0){printf("沒有記錄\n");return 0;}printf("得到:%d 條記錄\n", num);MYSQL_ROW sqlrow;for (int i = 0; i < num; i++){sqlrow = mysql_fetch_row(mysql_res);if (sqlrow == NULL){printf("數據處理完,或者出錯\n");break;}// 判斷列數int fields = mysql_field_count(&mysql);for (int j = 0; j < fields; j++){printf("fieds[%d]=%s\n", j, sqlrow[j]);}}// MYSQL_ROW sqlrow = NULL;// while( ( sqlrow = mysql_fetch_row(mysql_res)) )// {// //printf("sqlrow[0]=%s,sqlrow[1]=%s\n",sqlrow[0],sqlrow[1]);//// }mysql_free_result(mysql_res);mysql_close(&mysql);return 0;
}
邏輯說明:
- 初始化連接句柄,調用?
mysql_init
?。 - 調用?
mysql_real_connect
?連接數據庫,參數填入主機、用戶、密碼等信息。 - 定義 SQL 語句,用?
mysql_query
?執行查詢。 - 執行?
mysql_store_result
?獲取結果集,判斷是否為空。 - 調用?
mysql_num_rows
?獲取結果行數,遍歷結果集,用?mysql_fetch_row
?逐行讀取,結合?mysql_field_count
?遍歷列數據并打印。 - 最后用?
mysql_free_result
?釋放結果集,mysql_close
?關閉連接。
?