在C语言中连接数据库是许多应用程序开发的核心需求,无论是桌面应用、服务器端程序还是嵌入式系统,经常需要与数据库进行交互,C语言本身不提供直接操作数据库的内置函数,而是通过第三方库或数据库提供的API来实现连接,常见的数据库连接方式包括ODBC、JDBC(Java专用)、各数据库厂商提供的C/C++ API(如MySQL的C API、PostgreSQL的libpq、SQLite的C接口等),本文将以MySQL和SQLite为例,详细介绍C语言连接数据库的步骤、代码示例及注意事项。

连接数据库前的准备工作
在开始编写连接数据库的代码之前,需要完成以下准备工作:
- 安装数据库:根据需求选择合适的数据库(如MySQL、SQLite、PostgreSQL等)并安装到本地或服务器。
- 安装开发库:下载对应数据库的C语言开发库,MySQL需要安装
mysql-connector-c,SQLite需要安装sqlite3开发包。 - 配置开发环境:确保编译器(如gcc)能够找到头文件(
.h)和库文件(.lib或.so),在Linux下可通过pkg-config工具配置路径,在Windows下可能需要手动指定包含目录和库目录。
使用MySQL C API连接数据库
MySQL提供了官方的C语言API,支持跨平台操作,以下是连接MySQL数据库的详细步骤:
包含必要的头文件
#include <mysql/mysql.h> #include <stdio.h> #include <stdlib.h>
初始化连接句柄
MYSQL *conn;
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failedn");
exit(1);
} 连接数据库
使用mysql_real_connect函数建立连接,参数包括服务器地址、用户名、密码、数据库名、端口号等。
conn = mysql_real_connect(conn, "localhost", "username", "password", "database_name", 3306, NULL, 0);
if (conn == NULL) {
fprintf(stderr, "mysql_real_connect() failed: %sn", mysql_error(conn));
mysql_close(conn);
exit(1);
}
printf("Connected to MySQL successfully!n"); 执行SQL语句
通过mysql_query函数执行SQL查询,并使用mysql_store_result获取结果集。

if (mysql_query(conn, "SELECT * FROM users")) {
fprintf(stderr, "SELECT failed: %sn", mysql_error(conn));
} else {
MYSQL_RES *result = mysql_store_result(conn);
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
printf("%s %sn", row[0], row[1]); // 假设表有两列
}
mysql_free_result(result);
} 关闭连接
mysql_close(conn);
表:MySQL C API常用函数
| 函数名 | 功能描述 |
|---|---|
mysql_init() | 初始化连接句柄 |
mysql_real_connect() | 建立数据库连接 |
mysql_query() | 执行SQL语句 |
mysql_store_result() | 获取查询结果集 |
mysql_fetch_row() | 遍历结果集 |
mysql_close() | 关闭连接 |
使用SQLite C API连接数据库
SQLite是一款轻量级嵌入式数据库,无需单独的服务器进程,适合移动应用和小型项目,以下是连接SQLite的步骤:
包含头文件
#include <sqlite3.h> #include <stdio.h>
打开数据库
sqlite3_open函数用于打开或创建数据库文件。
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %sn", sqlite3_errmsg(db));
return 1;
}
printf("Opened database successfully!n"); 执行SQL语句
使用sqlite3_exec函数执行非查询类SQL(如INSERT、UPDATE),或通过回调函数处理查询结果。
char *errMsg = 0;
const char *sql = "CREATE TABLE IF NOT EXISTS users (id INT, name TEXT);";
rc = sqlite3_exec(db, sql, NULL, 0, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %sn", errMsg);
sqlite3_free(errMsg);
} 查询数据
sql = "SELECT * FROM users;";
rc = sqlite3_exec(db, sql, callback, 0, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %sn", errMsg);
sqlite3_free(errMsg);
}
// 回调函数示例
static int callback(void *data, int argc, char **argv, char **azColName) {
for (int i = 0; i < argc; i++) {
printf("%s = %sn", azColName[i], argv[i] ? argv[i] : "NULL");
}
return 0;
} 关闭数据库
sqlite3_close(db);
表:SQLite C API常用函数
| 函数名 | 功能描述 |
|---|---|
sqlite3_open() | 打开或创建数据库 |
sqlite3_exec() | 执行SQL语句 |
sqlite3_prepare_v2() | 预编译SQL语句 |
sqlite3_step() | 执行预编译语句 |
sqlite3_column_text() | 获取结果列数据 |
sqlite3_close() | 关闭数据库 |
数据库连接的注意事项
- 错误处理:数据库操作可能因网络、权限、SQL语法等问题失败,需检查每个函数的返回值并处理错误。
- 资源释放:及时释放结果集、预处理语句等资源,避免内存泄漏。
- 安全性:避免SQL注入攻击,使用参数化查询(如MySQL的
mysql_stmt_prepare或SQLite的sqlite3_bind_text)。 - 线程安全:多数数据库API不是线程安全的,需在多线程环境中使用互斥锁保护连接句柄。
相关问答FAQs
问题1:C语言连接数据库时如何处理中文乱码?
解答:中文乱码通常是由于字符编码不一致导致的,需确保数据库、表、字段使用UTF-8编码,并在连接时指定字符集,MySQL连接时可添加mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4");;SQLite默认支持UTF-8,但需确保源代码文件和终端编码一致。

问题2:如何优化C语言数据库连接的性能?
解答:优化性能的方法包括:
- 使用连接池减少频繁创建和销毁连接的开销;
- 批量操作(如批量插入)代替单条操作;
- 对查询结果集分页处理,避免一次性加载大量数据;
- 使用预处理语句(Prepared Statements)提高重复执行SQL的效率。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复