zoukankan      html  css  js  c++  java
  • 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 说明数据库中存在此表。

  • 相关阅读:
    C编程规范
    c# 闭包 小例
    计算前后2行的时间差
    判断是不是奇数
    条件表达式工具类
    代码重构-5 取消类的私有变量(实例变量)
    代码重构-4 通用方法 用 static
    代码重构-3 用Tuple代替 out与ref
    代码重构-2 简单不变的 if else 用字典代替
    代码重构-1 对参数中有 bool值的拆分
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/14378085.html
Copyright © 2011-2022 走看看