C++使用MySQL API连接数据库完整流程与示例
在C++开发中处理结构化数据时,常需直接调用MySQL原生API。通过包含mysql/mysql.h并正确链接客户端库,开发者可实现从建立会话到执行增删改查的全流程控制。本文将解析相关类结构与关键函数的用法。
环境准备与头文件集成
在开始编写代码前,需确保开发环境中已安装MySQL Client库。在代码层面,必须引入对应的接口定义文件。标准的做法是显式声明所需的输入输出流与字符串处理库:
#include <mysql/mysql.h>
#include <stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
此外,项目中通常需要定义全局的数据库会话指针与结果集变量,以便在不同业务模块间共享:
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
建立安全连接
所有数据库操作的基础在于成功获取一个有效的MYSQL句柄。这一过程分为两步:首先初始化句柄,随后填充具体的连接地址、用户凭据及目标数据库名。
第1步:会话初始化和认证
目的:确保程序能正确指向数据库服务器并验证身份。
- 入口:位于
main()或初始化函数首部。 - 动作:调用
mysql_init(NULL)分配内存,紧接着执行mysql_real_connect()。 - 重要参数:
- Host:"localhost"
- User/Password: 测试环境下常用"root"。
- Database: 指定的具体库名。
完成判断:检查mysql_real_connect返回值。若为NULL,通过mysql_error(conn)打印错误日志并终止进程。
int main() {
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "localhost",
"root", "root", "abc", 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
}
// 设置字符编码防止乱码
mysql_query(conn,"set names utf8");
// ... 后续操作 ...
}
数据结构映射与封装
为了提高代码的可维护性,建议将表字段映射为C++类对象。以下结构体定义了表结构的内存表示:
class people
{
public:
char name[20];
int pid;
int type;
char phone[30];
public:
void setall();
};
void people::setall()
{
// 接收用户标准输入并填充对象属性
cin >> pid >> name >> type >> phone;
}
核心增删改查(CRUD)实现
第2步:执行插入操作 (INSERT)
目的:向表中写入一条新记录。
- 动作:构造
sprintf拼接SQL语句,传入mysql_query()。 - 观察:控制台输出“添加成功”即视为完成。
void save(people a)
{
char sql[1000];
sprintf(sql,"insert into student values(%d,'%s',%d,'%s')",
a.pid, a.name, a.type, a.phone);
if(mysql_query(conn, sql))
{
printf("添加失败: (%s)\n",mysql_error(conn));
} else {
printf("添加成功!\n");
}
}
第3步:执行更新与删除操作
目的:根据主键修改或删除现有行。这两类操作的逻辑与插入类似,差异仅在于SQL模板。
更新示例逻辑:构建带有where子句的update语句。
where子句的delete from语句。在执行任何破坏性操作前,务必确认条件准确无误。
第4步:执行查询与数据读取 (SELECT)
目的:拉取数据并在屏幕展示。由于结果集通常较大,需先使用mysql_use_result()开启游标遍历。
- 动作:逐行调用
mysql_fetch_row(res)。 - 参数访问:数组下标对应Select列表的顺序(row[0], row[1]...)。
void show()
{
res = mysql_use_result(conn);
while ((row = mysql_fetch_row(res)) != NULL){
cout<|
资源释放与总结
当所有业务逻辑执行完毕(或在检测到致命错误退出时),必须关闭连接以释放服务器端资源。这需要在程序出口处调用mysql_close(conn)。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













