随笔 - 1506  文章 - 1  评论 - 7  阅读 - 58万

RTSP协议视频平台EasyNVR使用sqlite3如何判断一个表是否在数据库中已经存在?

新版的EasyNVR默认都是使用的sqlite数据库,sqlite数据库占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,并且能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合。

 

 

为了防止数据库内的表重复,导致编译问题,我们常常需要判断判断一个表是否在数据库中已经存在了,在sqlite3中,提供了一个sqlite3_exec函数,可以通过此函数的使用来判断一个表是否存在。

sqlite3_exec()的api如下:

1
int sqlite_exec(sqlite *db, const char *sql, int (*callback)(void *,int,char **,char **), void *, char **errmsg);

  

用来执行sql语句,查询的结果返回给回调函数callback。所以可以利用callback的使用来判断表是否存在。

sqlite_exec的参数说明如下:

db:是用于保存打开的数据库文件dbname的信息;
sql:要执行命令的语句;
callback:回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL;
void *:是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL;
errmsg:返回错误信息,注意是指向指针的指针;
返回值:执行成功返回SQLITE_OK,否则返回其他值。

要判断一个表是否存在,sql语句如下:

1
"SELECT COUNT(*) FROM sqlite_master where type ='table' and name ='" + strTableName + "'"

那么回调函数的实现如此:

1
2
3
4
5
6
7
8
9
10
11
12
13
static int callback(void *data, int argc, char **argv, char **azColName)
{
    if ( 1 == argc)
  {
       int iTableExist = atoi(*(argv)); 
     if (data!= NULL)
     {
         int* ptr= (int*)data;
        *ptr= iTableExist;
     }
  }
  return 0;
}

  

注意:返回值一定要写,否则下次调用 sqlite3_exec(…) 时会返回 SQLITE_ABORT

回调函数中的data是sqlite3_exec()传入的参数指针,即sqlite3_exec()中的void* 参数。

通过在回调函数中对data进行赋值操作,可以获取到sqlite3_exec()的执行结果,即通过赋值的 void* 的参数值来判断一个表是否存在于此数据库中。如果*ptr > 0 说明数据库中存在此表。

posted on   EasyNVR  阅读(112)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
历史上的今天:
2020-02-05 线上课堂助力疫情防控,EasyDSS教你如何打造高效的直播授课
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示