sqlite3 预处理方法 | 数据库论坛-380玩彩网官网入口
#include <stdio.h>
#include <stdarg.h>
#include "sqlite3.c"
// 参数类型枚举
typedef enum
{
param_type_int,
param_type_text,
param_type_null
} paramtype;
// 动态绑定函数
int bind_params(sqlite3_stmt *stmt, int param_count, ...)
{
va_list args;
va_start(args, param_count);
int rc;
for (int i = 0; i < param_count; i)
{
// 获取参数类型
paramtype type = va_arg(args, paramtype);
printf("参数%d类型: %d\n", i 1, type);
switch (type)
{
case param_type_int:
{
int value = va_arg(args, int);
rc = sqlite3_bind_int(stmt, i 1, value);
break;
}
case param_type_text:
{
const char *value = va_arg(args, const char *);
rc = sqlite3_bind_text(stmt, i 1, value, -1, sqlite_static);
break;
}
case param_type_null:
{
rc = sqlite3_bind_null(stmt, i 1);
break;
}
default:
rc = sqlite_error;
}
if (rc != sqlite_ok)
{
fprintf(stderr, "绑定参数%d失败: %s\n", i 1, sqlite3_errmsg(sqlite3_db_handle(stmt)));
va_end(args);
return rc;
}
}
va_end(args);
return sqlite_ok;
}
int main()
{
sqlite3 *db;
sqlite3_stmt *stmt;
const char *sql;
int rc;
// 打开数据库连接
rc = sqlite3_open("test4.db", &db);
if (rc != sqlite_ok)
{
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 创建表
sql = "create table if not exists users (id integer primary key, name text, age integer);";
rc = sqlite3_exec(db, sql, 0, 0, null);
if (rc != sqlite_ok)
{
fprintf(stderr, "无法创建表: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 插入sql
sql = "insert into users (name, age) values (:name, :age);";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
if (rc != sqlite_ok)
{
fprintf(stderr, "无法准备sql语句: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 插入多条记录
const char *names[] = {"alice", "bob", "charlie"};
int ages[] = {25, 30, 35};
int num_records = sizeof(names) / sizeof(names[0]);
for (int i = 0; i < num_records; i)
{
rc = bind_params(stmt, 2, param_type_text, names[i], param_type_int, ages[i]);
if (rc != sqlite_ok)
{
fprintf(stderr, "绑定参数失败: %d\n", rc);
break;
}
rc = sqlite3_step(stmt);
if (rc != sqlite_done)
{
fprintf(stderr, "执行失败: %s\n", sqlite3_errmsg(db));
}
else
{
printf("插入成功: %s, %d\n", names[i], ages[i]);
}
sqlite3_reset(stmt);
sqlite3_clear_bindings(stmt);
}
// 释放资源
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
本作品采用《cc 协议》,转载必须注明作者和本文链接