一)sqlite3_exec
1.头文件和函数原型
#include "sqlite3.h"
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*para,int argc,char**argv,char**argv_name), void *para,char **errmsg)
2.说明
第一个参数sqlite3*是打开的数据库;
第二个参数const char *sql是要执行的sql语句;
第三个参数int (*callback)(void*para,int argc,char**argv,char**argv_name)是回调函数;
第四个参数void *para是传递给回调函数的参数
第五个参数char **errmsg是如果sqlite3_exec函数执行发生错误返回的错误信息;
执行成功返回SQLITE_OK (0),否则返回其他值。
二)sqlite3_exec回调函数
回调函数是用户自定义的,格式如下:
int callback(void*para,int argc,char**argv,char**argv_name)
{
/*回调函数功能*/
}
说明:
第一个参数void*para是sqlite3_exec传给回调函数的参数;
第二个参数int argc是执行sqlite3_exec的sql语句后sqlite3的shell环境打印的字段数目;
第三个参数char**argv是字段的值(字符串类型);
第四个参数char**argv_name是字段的名称。
三)判断数据库中是否存在表
在sqlite3的shell环境中执行下面的命令和sql语句可以看到test.db数据库中存在表test_table。

现在我们用sqlite3_exec及其回调函数来判断test_table是否存在于test.db数据库中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"
#define MAX_BUF_SIZE 1024
int callback(void *para, int argc, char **argv, char **argv_name)
{
int i;
for(i=0; i<argc; i++)
*(int *)para = atoi(argv[i]);
return 0;
}
int main(int argc, char *argv[])
{
sqlite3 *db = NULL;
char *zErrMsg = NULL;
int result = -1;
char sql_ifexis[MAX_BUF_SIZE];
if(sqlite3_open("test.db", &db) != SQLITE_OK)
{
printf("can't open database: %s\n", sqlite3_errmsg(db));
return -1;
}
zErrMsg = NULL;
memset(sql_ifexis, 0, sizeof(sql_ifexis));
snprintf(sql_ifexis, sizeof(sql_ifexis), "SELECT count(*) FROM sqlite_master WHERE type='table' AND name='%s';", "test_table");
sqlite3_exec(db, sql_ifexis, callback, &result, NULL);
if(result == 1)
{
printf("table existence!\n");
}
else if(result == 0)
{
printf("table not existence!\n");
}
return 0;
}
程序运行结果:

本文介绍了如何利用sqlite3_exec函数及其回调函数检查SQLite数据库中是否存在指定的表。通过执行SQL查询并自定义回调函数处理结果,程序可以判断test_table是否在test.db数据库中,并输出相应的提示信息。
1134

被折叠的 条评论
为什么被折叠?



