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


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

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

    sqlite3_exec()的api如下:

    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语句如下:

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

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

    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 说明数据库中存在此表。

  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/14378085.html
Copyright © 2020-2023  润新知