【全志H616开发】使用sqlite3_exec函数操作SQLite数据库

sqlite3_exec函数介绍

sqlite3_exec 是 SQLite 数据库库中的一个函数,用于执行一条或多条 SQL 语句。这个函数的原型是:

int sqlite3_exec(
  sqlite3*,
  const char *sql,
  int (*callback)(void*,int,char**,char**),
  void *,
  char **errmsg
);

参数

  • sqlite3*: 这是一个指向数据库连接对象的指针。这个指针是通过 sqlite3_open 或相关函数获得的。
  • const char *sql: 这是一个 C 字符串,包含要执行的 SQL 语句。如果包含多条 SQL 语句,它们应该用分号分隔。
  • int (callback)(void,int,char**,char**):
    这是一个指向回调函数的指针。这个函数将在每一行结果产生时被调用。如果不需要回调函数,可以传递 NULL。
  • void *: 这是传递给回调函数的第一个参数。如果不需要,可以传递 NULL。
  • char **errmsg:
    这是一个指向错误消息字符串的指针的指针。如果执行过程中发生错误,错误消息字符串将被存储在这个位置。调用者需要在使用完后释放这个字符串。

返回值
这个函数返回一个整数,表示操作的结果。常见的返回值包括:

  • SQLITE_OK(0):表示操作成功。
  • 其他错误代码:表示操作失败。错误代码的定义可以在 SQLite 的官方文档中找到。

callback回调函数

回调函数 callback 在 SQLite 中用于处理 sqlite3_exec 执行 SQL 查询后返回的结果集。每当查询返回一行数据时,SQLite 都会调用一次这个回调函数。通过回调函数,用户可以处理查询结果,例如打印结果或存储到数据结构中。

int callback(void *data, 
			 int argc, 
			 char **argv, 
			 char **azColName);
  • *arg :是sqlite3_exec函数的第四个参数
  • data column_size :数据库的字段数(就是name sec num 这些类型有几个)
  • column_value[] :列的值(就是对应的name secscore 对应的值)
  • column_name :字段名字(就是name sec score的这些名字)

代码示例

功能描述
如果表不存在,则创建表,如果存在,不创建表,并插入数据:211,‘sun’,99,
再借用回调函数输出数据信息。

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{
    int i;
    printf("arg = %s\n",(char *)arg);
    for(i=0;i<column_size;i++){
        printf("%s = %s\n",column_name[i],(char *)column_value[i]);
    }
    printf("========================\n");
    return 0 ;// 数据库中有几条数据它回调函数就会调用几次
}
int main(int argc,char **argv)
{
    sqlite3 *db = NULL;
    int ret = 0;
    char *errmsg;  //sqlite3_exec函数会自动分配地址,记得free

    if(argc<2){
        printf("Uage: %s xxx.db\n",argv[0]);
        exit(-1);
    }
    if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
        printf("ret = %d   create %s success\n",ret,argv[1]);
    }else{
        printf("ret = %d   creat %s fail\n",ret,argv[1]);
        printf("error num = %d  error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));
        if(ret==14){
            printf("permisson deny\n");
        }
        exit(-1);

    }
    ret = sqlite3_exec(db,"create table class1(id Integer,name char,score Integer);", \
            callback,"into callback",&errmsg);
    printf("ret = %d error message %s\n",ret,errmsg);

    sqlite3_exec(db,"insert into class1 values(211,'sun',99);", \
            callback,"into callback",&errmsg);

    sqlite3_exec(db,"select * from class1", \
            callback,"into callback",&errmsg);
	sqlite3_free(errmsg);

    printf("Done\n");
    sqlite3_close(db);

    return 0;
}


  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`sqlite3_prepare_v2`和`sqlite3_exec`函数都是SQLite数据库的API函数,但在功能和使用方面有所不同。 `sqlite3_prepare_v2`函数是用于准备SQL语句的,它需要三个参数:一个SQLite数据库连接对象,一个SQL语句字符串和一个指向已编译SQL语句的指针。它将SQL语句编译为字节码,但并不执行该语句,因此它通常与`sqlite3_step`函数结合使用,以逐步执行SQL语句。 例如,以下代码演示了如何使用`sqlite3_prepare_v2`和`sqlite3_step`函数来执行SELECT语句: ``` sqlite3_stmt* stmt; const char* sql = "SELECT * FROM mytable"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); while (sqlite3_step(stmt) == SQLITE_ROW) { // 处理结果集 } sqlite3_finalize(stmt); ``` 相比之下,`sqlite3_exec`函数可以在一次调用中执行一条完整的SQL语句。它需要四个参数:一个SQLite数据库连接对象,一个SQL语句字符串,一个回调函数和一个回调函数的第一个参数。该回调函数将在每次执行SQL语句时调用,以处理结果集或执行其他自定义操作。 例如,以下代码演示了如何使用`sqlite3_exec`函数来执行INSERT语句: ``` const char* sql = "INSERT INTO mytable (id, name) VALUES (1, 'John')"; sqlite3_exec(db, sql, NULL, NULL, NULL); ``` 总的来说,`sqlite3_prepare_v2`函数比`sqlite3_exec`函数更灵活,因为它允许逐步执行SQL语句,并提供更多的控制和错误处理机制。但是,如果您只需要执行一次简单的SQL语句,则`sqlite3_exec`函数可能更方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值