欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++中如何判断sqlite表是否存在

程序员文章站 2022-05-31 12:44:28
在项目中遇到需要判断sqlite数据库中某个表是否存在,上网搜索一些资料后,解决了问题,如下: 首先,在每个sqlite数据库中,都有一个名为sqlite_master的表,它定义了数据库的模式,它的结构如下: 这个表中记录了数据库中的相关信息,我们通过在这个表中查找我们需要判断的表来判断其是否存在 ......

   在项目中遇到需要判断sqlite数据库中某个表是否存在,上网搜索一些资料后,解决了问题,如下:

  首先,在每个sqlite数据库中,都有一个名为sqlite_master的表,它定义了数据库的模式,它的结构如下:

sqlite_master (
  type text, //项目的类型,如table、index、view、trigger
  name text, //项目的名称,如表名、索引名等
  tbl_name text, //所从属的表名,如索引所在的表名。对于表来说,该列就是表名本身
  rootpage integer, //项目在数据库页中存储的编号。对于视图和触发器,该列值为0或者null
  sql text   //创建该项目的sql语句
);

  这个表中记录了数据库中的相关信息,我们通过在这个表中查找我们需要判断的表来判断其是否存在。相关代码如下:

char strfindtable[128];
sprintf_s(strfindtable, "select * from   where type ='table' and name ='%s'", tabletname); //tablename为表名
sqlite3_stmt* stmt0 = null;
if (sqlite3_prepare_v2(conn, strfindtable, strlen(strfindtable), &stmt0, null) != sqlite_ok) {
  if (stmt0)
    sqlite3_finalize(stmt0);
       sqlite3_close(conn);
       cout << "语句初始化错误";
       return;
  }
int r = sqlite3_step(stmt0);
    //判断表存在,结果集是否已到末尾
    //通过sqlite3_step命令执行创建表的语句。对于ddl和dml语句而言, sqlite3_step执行正确的返回值
    //只有sqlite_done,对于select查询而言,如果有数据返回sqlite_row,当到达结果集末尾时则返回sqlite_done。
if (r == sqlite_done){
  cout<<"table doesn't existed";
}
else if (r == sqlite_row){
  cout<<"table had existed";
}

  这里要注意的是,当sqlite_master表中没有我们查询的表示,它返回的结果集并不会为空,它先返回表项,所以需要使用sqlite3_step。该函数用于评估sqlite3_prepare函数返回的prepared_statement对象,在执行完该函数之后,prepared_statement对象的内部指针将指向其返回的结果集的第一行。如果打算进一步迭代其后的数据行就需要不断的调用该函数,直到所有的数据行都遍历完毕。在这里,使用了sqlite3_step之后,如果返回的是sqlite_done,就说明结果集到了末尾,也就是说没有找到我们判断存在与否的表,即表不存在;如果返回的是sqlite_row,说明在sqlite_master中找到了表相关的信息,即表存在。