SQLite 是一个轻量级的嵌入式数据库引擎,广泛用于各种应用程序中,包括移动应用和桌面软件。SQLite 提供了丰富的 C 语言 API,使得开发人员能够方便地与数据库进行交互。以下是 SQLite3 常用的一些函数介绍,这些函数可以帮助你完成数据库操作的基本任务。
SQLite3 常用函数介绍
1. 打开和关闭数据库
-
sqlite3_open(const char *filename, sqlite3 **ppDb)
- 用途:打开一个数据库文件或创建一个新的数据库文件。
- 参数:
filename
:数据库文件的路径。ppDb
:一个指向sqlite3 *
的指针,用于存储数据库连接句柄。
- 返回值:在成功时返回
SQLITE_OK
,否则返回一个错误代码。
-
sqlite3_close(sqlite3 *db)
- 用途:关闭一个已经打开的数据库连接。
- 参数:
db
:指向sqlite3
数据库连接的指针。
- 返回值:在成功时返回
SQLITE_OK
,否则返回一个错误代码。
2. 执行 SQL 语句
-
sqlite3_exec(sqlite3 *db, const char *zSql, void (*callback)(void*, int, char**, char**), void *pArg, char **pzErrmsg)
- 用途:执行一条 SQL 语句,并可选择性地指定一个回调函数来处理查询结果。
- 参数:
db
:指向sqlite3
数据库连接的指针。zSql
:要执行的 SQL 语句字符串。callback
:一个回调函数指针,用于处理查询结果。pArg
:传递给回调函数的任意数据。pzErrmsg
:用于存储错误信息的指针。
- 返回值:返回一个 SQLite 错误代码。
-
sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail)
- 用途:预编译一条 SQL 语句。
- 参数:
db
:指向sqlite3
数据库连接的指针。zSql
:要预编译的 SQL 语句字符串。nByte
:SQL 语句字符串的字节数(通常设为-1
表示整个字符串)。ppStmt
:用于存储预编译的 SQL 语句句柄的指针。pzTail
:用于存储 SQL 语句末尾剩余部分的指针(通常忽略)。
- 返回值:返回一个 SQLite 错误代码。
-
sqlite3_step(sqlite3_stmt *pStmt)
- 用途:执行预编译的 SQL 语句的下一步。
- 参数:
pStmt
:指向预编译的 SQL 语句句柄的指针。
- 返回值:返回一个 SQLite 错误代码,表示执行状态。
-
sqlite3_finalize(sqlite3_stmt *pStmt)
- 用途:释放预编译的 SQL 语句句柄。
- 参数:
pStmt
:指向预编译的 SQL 语句句柄的指针。
- 返回值:返回一个 SQLite 错误代码。
3. 错误处理
sqlite3_errmsg(sqlite3 *db)
- 用途:获取最近发生的错误的文本描述。
- 参数:
db
:指向sqlite3
数据库连接的指针。
- 返回值:返回一个字符串,描述最近发生的错误。
4. 数据库事务
sqlite3_exec(sqlite3 *db, const char *zSql, void (*callback)(void*, int, char**, char**), void *pArg, char **pzErrmsg)
- 用途:执行事务相关的 SQL 语句(如
BEGIN
,COMMIT
,ROLLBACK
)。 - 参数:
db
:指向sqlite3
数据库连接的指针。zSql
:要执行的 SQL 语句字符串。callback
:一个回调函数指针,用于处理查询结果。pArg
:传递给回调函数的任意数据。pzErrmsg
:用于存储错误信息的指针。
- 返回值:返回一个 SQLite 错误代码。
- 用途:执行事务相关的 SQL 语句(如
5. 数据操作
-
sqlite3_bind_*
系列函数- 用途:绑定参数到预编译的 SQL 语句。
- 示例:
sqlite3_bind_text(sqlite3_stmt *pStmt, int iParam, const char *zText, int nText, void (*xFree)(void *))
- 用途:绑定一个文本参数到预编译的 SQL 语句。
sqlite3_bind_int(sqlite3_stmt *pStmt, int iParam, int iValue)
- 用途:绑定一个整数参数到预编译的 SQL 语句。
sqlite3_bind_double(sqlite3_stmt *pStmt, int iParam, double dValue)
- 用途:绑定一个浮点数参数到预编译的 SQL 语句。
-
sqlite3_column_*
系列函数- 用途:从预编译的 SQL 语句的结果集中检索数据。
- 示例:
sqlite3_column_text(sqlite3_stmt *pStmt, int iCol)
- 用途:获取一个文本列的数据。
sqlite3_column_int(sqlite3_stmt *pStmt, int iCol)
- 用途:获取一个整数列的数据。
sqlite3_column_double(sqlite3_stmt *pStmt, int iCol)
- 用途:获取一个浮点数列的数据。
sqlite3_column_blob(sqlite3_stmt *pStmt, int iCol)
- 用途:获取一个 BLOB 列的数据。
示例代码
下面是一个使用 SQLite3 C API 的完整示例,演示如何打开数据库、执行 SQL 语句、预编译 SQL 语句并处理结果:
#include <stdio.h>
#include <sqlite3.h>
// 回调函数,用于处理查询结果
static int callback(void *data, int argc, char **argv, char **azColName) {
int i;
fprintf((FILE *)data, "%s: ", (const char *)data);
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char *argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// 打开数据库
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 创建表
const char *create_table_sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER NOT NULL)";
rc = sqlite3_exec(db, create_table_sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_close(db);
return 1;
}
// 插入数据
const char *insert_sql = "INSERT INTO users (name, age) VALUES (?, ?)";
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 绑定参数并执行插入
const char *name = "Alice";
int age = 30;
rc = sqlite3_bind_text(stmt, 1, name, -1, SQLITE_TRANSIENT);
rc |= sqlite3_bind_int(stmt, 2, age);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
fprintf(stderr, "Insert error: %s\n", sqlite3_errmsg(db));
}
// 清理
sqlite3_finalize(stmt);
// 查询数据
const char *select_sql = "SELECT name, age FROM users";
rc = sqlite3_exec(db, select_sql, callback, stdout, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// 关闭数据库
sqlite3_close(db);
return 0;
}
代码解释
- 打开数据库:使用
sqlite3_open
函数打开数据库文件。 - 创建表:使用
sqlite3_exec
函数执行 SQL 语句创建表。 - 预编译插入语句:使用
sqlite3_prepare_v2
函数预编译插入语句,并使用sqlite3_bind_text
和sqlite3_bind_int
函数绑定参数。 - 执行插入语句:使用
sqlite3_step
函数执行预编译的插入语句。 - 预编译查询语句:使用
sqlite3_exec
函数执行查询语句,并使用回调函数callback
处理查询结果。 - 关闭数据库:使用
sqlite3_close
函数关闭数据库连接。
总结
SQLite3 提供了一组强大的 C 语言 API,使得开发人员能够方便地进行数据库操作。通过上述介绍和示例代码,你可以了解到如何使用 SQLite3 API 打开和关闭数据库、执行 SQL 语句、处理查询结果等基本操作。如果你有任何其他问题或需要进一步的帮助,请随时提问。