答案是使用MySQL C API连接数据库需先安装开发库,包含mysql.h头文件,调用mysql_init初始化,mysql_real_connect建立连接,执行查询或插入操作后释放资源。

在C++中连接和操作MySQL数据库,通常使用MySQL官方提供的C API(即 MySQL Connector/C)或其封装库如 MySQL++。本文以原生的 MySQL C API 为例,介绍如何连接、查询、插入数据,并给出完整实例。
1. 环境准备与依赖安装
确保系统已安装 MySQL 开发库:
-
Ubuntu/Debian:
sudo apt-get install libmysqlclient-dev -
CentOS/RHEL:
sudo yum install mysql-devel - Windows:下载并配置 MySQL Connector/C,设置头文件和库路径
编译时需链接库:-lmysqlclient
2. 包含头文件并初始化连接
使用 提供的接口进行数据库操作。
立即学习“C++免费学习笔记(深入)”;
#include#include int main() { MYSQL *conn; conn = mysql_init(NULL); if (!conn) { std::cerr << "初始化失败" << std::endl; return 1; } // 连接数据库 if (!mysql_real_connect(conn, "localhost", "root", "password", "testdb", 3306, NULL, 0)) { std::cerr << "连接失败: " << mysql_error(conn) << std::endl; mysql_close(conn); return 1; } std::cout << "数据库连接成功!" << std::endl;
说明:
-
mysql_init()初始化连接句柄 -
mysql_real_connect()建立连接,参数依次为:主机、用户名、密码、数据库名、端口等
3. 执行SQL语句
使用 mysql_query() 执行非查询语句,用 mysql_use_result() 或 mysql_store_result() 处理查询结果。
本文介绍了Python操作MYSQL、执行SQL语句、获取结果集、遍历结果集、取得某个字段、获取表字段名、将图片插入数据库、执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐。如果想查看在线版请访问:https://www.jb51.net/article/34102.htm
// 插入数据
const char *insert_sql = "INSERT INTO users (name, age) VALUES ('张三', 25)";
if (mysql_query(conn, insert_sql)) {
std::cerr << "插入失败: " << mysql_error(conn) << std::endl;
} else {
std::cout << "插入成功,影响行数: " << mysql_affected_rows(conn) << std::endl;
}
// 查询数据
if (mysql_query(conn, "SELECT id, name, age FROM users")) {
std::cerr << "查询失败: " << mysql_error(conn) << std::endl;
} else {
MYSQL_RES *result = mysql_store_result(conn);
if (result) {
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
std::cout << "ID: " << row[0]
<< ", 姓名: " << row[1]
<< ", 年龄: " << row[2] << std::endl;
}
mysql_free_result(result);
}
}
关键函数说明:
-
mysql_query():执行SQL字符串 -
mysql_store_result():将结果集全部取回内存 -
mysql_fetch_row():逐行获取数据,返回字符串数组 -
mysql_free_result():释放结果集资源
4. 预处理语句(防SQL注入)
对于带参数的操作,推荐使用预处理语句。
MYSQL_STMT *stmt = mysql_stmt_init(conn);
const char *sql = "INSERT INTO users (name, age) VALUES (?, ?)";
if (mysql_stmt_prepare(stmt, sql, strlen(sql))) {
std::cerr << "预处理失败: " << mysql_stmt_error(stmt) << std::endl;
mysql_stmt_close(stmt);
return 1;
}
// 绑定参数
MYSQL_BIND bind[2];
std::string name = "李四";
int age = 30;
memset(bind, 0, sizeof(bind));
bind[0].buffer_type = MYSQL_TYPE_STRING;
bind[0].buffer = (char*)name.c_str();
bind[0].buffer_length = name.length();
bind[1].buffer_type = MYSQL_TYPE_LONG;
bind[1].buffer = &age;
if (mysql_stmt_bind_param(stmt, bind)) {
std::cerr << "绑定参数失败: " << mysql_stmt_error(stmt) << std::endl;
}
if (mysql_stmt_execute(stmt)) {
std::cerr << "执行失败: " << mysql_stmt_error(stmt) << std::endl;
} else {
std::cout << "预处理插入成功" << std::endl;
}
mysql_stmt_close(stmt);
5. 关闭连接与清理
程序结束前务必释放资源。
mysql_close(conn);
return 0;
}
完整编译命令(Linux):
g++ -o db_example db_example.cpp -lmysqlclient
注意事项:
- 所有操作应包含错误检查
- 多线程环境下需确保连接安全或使用连接池
- 生产环境建议封装成类管理连接生命周期










