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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!