在C语言中调用数据库里的数据,通常需要借助数据库提供的API(应用程序接口)或第三方库来实现,不同数据库(如MySQL、SQLite、PostgreSQL等)有不同的连接方式和操作步骤,但核心流程相似,包括加载库、建立连接、执行SQL语句、获取结果以及释放资源,以下以MySQL数据库为例,详细说明C语言如何调用数据库数据。
准备工作
需要安装MySQL数据库对应的C语言连接库,如libmysqlclient,在Linux系统中,可通过sudo apt-get install libmysqlclient-dev安装;在Windows系统中,需从MySQL官网下载并配置开发环境,确保已安装MySQL数据库服务,并创建好待操作的数据库和表。
包含头文件与初始化
在C程序中,需包含MySQL的头文件<mysql.h>,并初始化MySQL库。

#include <mysql.h>
#include <stdio.h>
int main() {
MYSQL *conn; // 定义MySQL连接对象
conn = mysql_init(NULL); // 初始化连接
if (conn == NULL) {
fprintf(stderr, "mysql_init() failedn");
return 1;
}
// 后续操作...
mysql_close(conn); // 关闭连接
return 0;
}
建立数据库连接
使用mysql_real_connect()函数连接到MySQL服务器,需指定主机名、用户名、密码、数据库名等参数:
conn = mysql_real_connect(conn, "localhost", "username", "password", "database_name", 0, NULL, 0);
if (conn == NULL) {
fprintf(stderr, "mysql_real_connect() failed: %sn", mysql_error(conn));
return 1;
}
执行SQL查询语句
通过mysql_query()函数执行SQL查询语句,例如查询users表中的所有数据:
if (mysql_query(conn, "SELECT id, name, age FROM users")) {
fprintf(stderr, "SELECT failed: %sn", mysql_error(conn));
return 1;
}
获取查询结果
查询结果存储在MYSQL_RES结构体中,需使用mysql_store_result()或mysql_use_result()获取结果集,前者将结果全部加载到内存,适合小数据量;后者逐行获取,适合大数据量:

MYSQL_RES *result = mysql_store_result(conn);
if (result == NULL) {
if (mysql_field_count(conn) == 0) {
// 无结果集的查询(如INSERT、UPDATE)
printf("%d rows affectedn", (int)mysql_affected_rows(conn));
} else {
fprintf(stderr, "mysql_store_result() failedn");
return 1;
}
} else {
// 遍历结果集
MYSQL_ROW row;
MYSQL_FIELD *field;
unsigned int num_fields = mysql_num_fields(result);
unsigned int num_rows = mysql_num_rows(result);
// 打印列名
while ((field = mysql_fetch_field(result))) {
printf("%-15s", field->name);
}
printf("n");
// 打印每一行数据
while ((row = mysql_fetch_row(result))) {
for (unsigned int i = 0; i < num_fields; i++) {
printf("%-15s", row[i] ? row[i] : "NULL");
}
printf("n");
}
mysql_free_result(result); // 释放结果集
}
处理错误与释放资源
在操作过程中需检查每个函数的返回值,确保错误及时处理,程序结束时,通过mysql_close()关闭连接,mysql_library_end()释放MySQL库资源。
常见操作流程总结
| 步骤 | 函数/操作 | 说明 |
|---|---|---|
| 初始化 | mysql_init() |
创建并初始化MySQL连接对象 |
| 连接 | mysql_real_connect() |
连接到MySQL服务器,需认证信息 |
| 执行SQL | mysql_query() |
执行SQL查询或更新语句 |
| 获取结果 | mysql_store_result() |
将结果集加载到内存 |
| 遍历结果 | mysql_fetch_row() |
逐行获取结果数据 |
| 释放资源 | mysql_free_result() |
释放结果集内存 |
| 关闭连接 | mysql_close() |
关闭数据库连接 |
相关问答FAQs
Q1: C语言连接MySQL时,如何处理中文乱码问题?
A1: 乱码通常是由于字符集不匹配导致的,可在连接数据库后执行SET NAMES utf8;语句,或在mysql_real_connect()中通过client_flag参数指定字符集(如CLIENT_MULTI_STATEMENTS),确保数据库、表、字段的字符集均为utf8mb4,且C程序源文件编码为UTF-8。
Q2: 如何防止SQL注入攻击?
A2: 应避免直接拼接SQL字符串,而是使用预处理语句(Prepared Statements),通过mysql_stmt_prepare()、mysql_stmt_bind_param()和mysql_stmt_execute()等函数,将参数与SQL语句分离,确保输入数据不会被解释为SQL代码。

MYSQL_STMT *stmt = mysql_stmt_init(conn); mysql_stmt_prepare(stmt, "SELECT * FROM users WHERE name = ?", 34); MYSQL_BIND bind[1]; // 绑定参数... mysql_stmt_execute(stmt);
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/247508.html