sqlite3_bind()
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 准备SQL语句
const char *sql = "INSERT INTO users (id, name) VALUES (?, ?)";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法准备SQL语句: %s\n", sqlite3_errmsg(db));
return 1;
}
// 绑定参数
int id = 1;
const char *name = "John Doe";
sqlite3_bind_int(stmt, 1, id);
sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
// 执行SQL语句
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
fprintf(stderr, "无法执行SQL语句: %s\n", sqlite3_errmsg(db));
return 1;
}
// 释放资源
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
sqlite3_prepare_v2()
sqlite3_prepare_v2()
函数是SQLite数据库API中的一个重要函数,用于准备SQL语句以供后续执行。它的作用是将SQL语句编译成一个可执行的SQL语句对象,该对象可以被后续的SQLite API函数使用。在编译过程中,SQLite会对SQL语句进行语法分析、语义分析和查询优化,并将其转换为一个字节码程序,以便后续的执行。
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 准备SQL语句
const char *sql = "SELECT * FROM users";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法准备SQL语句: %s\n", sqlite3_errmsg(db));
return 1;
}
// 执行SQL语句
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
// 处理查询结果
int id = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
printf("ID: %d, Name: %s\n", id, name);
}
// 释放资源
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
我们首先打开了一个名为test.db
的数据库连接。然后使用sqlite3_prepare_v2()
函数准备了一个SELECT
语句,该语句将所有用户的ID和姓名查询出来。准备完毕后,我们使用sqlite3_step()
函数执行了SQL语句,并在循环中处理了查询结果。最后释放了资源并关闭了数据库连接。
通过这个例程,我们演示了如何使用sqlite3_prepare_v2()
函数来准备SQL语句,并使用后续的SQLite API函数执行和处理查询结果。这个函数的作用是非常重要的,它可以帮助我们安全地执行SQL语句,并且可以提高执行效率。
sqlite3_get_table()
sqlite3_get_table()
函数在SQLite3.5中已经被废弃,不建议在新的代码中使用。相反,建议使用sqlite3_exec()
函数来执行查询并获取结果。
以下是一个使用sqlite3_exec()
函数执行查询的例程:
#include <stdio.h>
#include <sqlite3.h>
int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 执行查询
const char *sql = "SELECT * FROM users";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// 关闭数据库连接
sqlite3_close(db);
return 0;
}
使用事务
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 开始事务
rc = sqlite3_exec(db, "BEGIN TRANSACTION", 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法开始事务: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_close(db);
return 1;
}
// 在事务中执行一系列操作
// ...
// 提交事务
rc = sqlite3_exec(db, "COMMIT", 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法提交事务: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// 关闭数据库连接
sqlite3_close(db);
return 0;
}
sqlite3_exec与sqlite3_prepare_v2使用异同:
在SQLite中,sqlite3_exec()
和sqlite3_prepare_v2()
都是用于执行SQL语句的函数,但它们的使用场景略有不同。
sqlite3_exec()
主要用于执行一次性的SQL语句或者不需要多次执行的SQL语句,比如创建表、插入数据、更新数据等操作。它可以直接执行SQL语句并提供一个回调函数来处理查询结果。
而sqlite3_prepare_v2()
主要用于执行需要多次执行的SQL语句,比如带有参数的查询或者更新操作。它将SQL语句编译成一个准备好的语句(prepared statement),可以多次执行并传入不同的参数值。
因此,需要执行一次性的SQL语句或者不需要多次执行的SQL语句时,可以使用sqlite3_exec()
;而需要多次执行带有参数的SQL语句时,可以使用sqlite3_prepare_v2()
来提高执行效率。
exec使用:
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 创建表
const char *sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// 插入数据
sql = "INSERT INTO users (name, age) VALUES ('Alice', 25)";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// 关闭数据库连接
sqlite3_close(db);
return 0;
}
prepare使用:
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 准备查询语句
const char *sql = "SELECT * FROM users WHERE age > ?";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
fprintf(stderr, "准备查询语句错误: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 绑定参数并执行查询
int minAge = 30;
sqlite3_bind_int(stmt, 1, minAge);
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 处理查询结果
int id = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
printf("ID: %d, Name: %s, Age: %d\n", id, name, age);
}
// 释放查询语句
sqlite3_finalize(stmt);
// 关闭数据库连接
sqlite3_close(db);
return 0;
}
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
// 打开数据库连接
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 准备插入语句
const char *sql = "INSERT INTO users (name, age) VALUES (?, ?)";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != SQLITE_OK) {
fprintf(stderr, "准备插入语句错误: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 执行多次插入操作
const char *names[] = {"Bob", "Charlie", "David"};
int ages[] = {30, 35, 40};
for (int i = 0; i < 3; i++) {
sqlite3_bind_text(stmt, 1, names[i], -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, ages[i]);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
fprintf(stderr, "插入操作失败: %s\n", sqlite3_errmsg(db));
}
sqlite3_reset(stmt); // 重置语句,以便下次执行
}
// 释放插入语句
sqlite3_finalize(stmt);
// 关闭数据库连接
sqlite3_close(db);
return 0;
}