一、连接数据库基础
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
关闭连接。