sqlite3 预处理方法
#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 协议》,转载必须注明作者和本文链接