在C语言中创建数据库通常需要借助第三方库,因为C语言本身没有内置的数据库操作功能,常用的轻量级数据库库如SQLite、Berkeley DB等,其中SQLite因其零配置、单文件、跨平台的特点,成为C语言开发中创建和操作数据库的首选工具,以下以SQLite为例,详细介绍如何在C语言中创建数据库、表及进行基本操作。

环境准备
在使用SQLite之前,需下载SQLite开发库,从SQLite官网(https://www.sqlite.org/download.html)获取预编译的源代码或动态链接库(如sqlite3.lib、sqlite3.dll),并将其集成到开发环境中,以Windows为例,将sqlite3.h头文件放入项目include目录,sqlite3.lib和sqlite3.dll放入lib和系统目录中,在Linux环境下,可通过包管理器安装,如sudo apt-get install libsqlite3-dev。
创建数据库连接
SQLite通过sqlite3_open函数打开或创建数据库,该函数接受数据库文件路径作为参数,若文件不存在,则会自动创建;若存在,则打开现有数据库,函数原型为:
int sqlite3_open(const char *filename, sqlite3 **ppDb);
filename为数据库文件名(如"test.db"),ppDb为指向sqlite3指针的指针,用于后续数据库操作,执行成功返回SQLITE_OK,失败返回错误码,示例代码:
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
printf("数据库创建/打开成功\n");
sqlite3_close(db);
return 0;
}
执行SQL语句创建表
创建表需通过sqlite3_exec函数执行SQL语句,该函数封装了SQL语句的编译、执行和结果处理,适合执行非查询类SQL(如CREATE、INSERT、UPDATE等),函数原型:

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg);
参数sql为SQL语句字符串,errmsg用于返回错误信息,以下代码创建一个名为users的表:
const char *sql = "CREATE TABLE IF NOT EXISTS users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT NOT NULL,"
"age INTEGER);";
char *errMsg = NULL;
rc = sqlite3_exec(db, sql, NULL, NULL, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", errMsg);
sqlite3_free(errMsg);
} else {
printf("表创建成功\n");
}
插入与查询数据
插入数据同样使用sqlite3_exec,但需注意SQL语句中的参数绑定(防止SQL注入),查询数据则需通过sqlite3_prepare_v2、sqlite3_step和sqlite3_column_*系列函数处理结果集,例如插入数据:
const char *insertSql = "INSERT INTO users (name, age) VALUES (?, ?);";
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, insertSql, -1, &stmt, NULL);
if (rc == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "Alice", -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, 25);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
关闭数据库连接
操作完成后,需调用sqlite3_close释放数据库资源:
sqlite3_close(db);
相关问答FAQs
Q1:SQLite与MySQL在C语言中使用有何区别?
A1:SQLite是嵌入式数据库,无需独立服务,直接通过文件操作,适合轻量级应用;MySQL是客户端/服务器模式,需先启动服务,通过网络连接,适合多用户、高并发场景,SQLite无需额外配置,MySQL需处理连接管理、权限控制等复杂逻辑。

Q2:如何处理SQLite数据库中的错误?
A2:SQLite函数返回错误码(如SQLITE_OK),可通过sqlite3_errmsg(db)获取错误描述,建议在关键操作后检查返回值,并使用sqlite3_free释放错误信息内存。if (rc != SQLITE_OK) { fprintf(stderr, "错误: %s\n", sqlite3_errmsg(db)); }。