SQLite第三课 使用例子

1 打开数据库文件
  sqlite3* m_db = NULL;
  int ret = sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE, NULL);
  if (ret != SQLITE_OK)
  {
    return;
  }

2 如果表不存在,创建表
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER ,\
    type INTEGER,\
    kind INTEGER)";

3 创建唯一的主键ID
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER PRIMARY KEY AUTOINCREMENT,\
    type INTEGER,\
    kind INTEGER)";

4 查询
  char szSql[1024] = {0};
  sprintf(szSql, "select distinct * from tb_test");
  sqlite3_stmt* stmt = NULL;
  sqlite3_prepare(m_db, szSql, -1, &stmt, 0);
  while (sqlite3_step(stmt) == SQLITE_ROW)
  {
    const unsigned char*  szPOIName = sqlite3_column_text(stmt, 0);
    char szName[128] = {0};
    if (szPOIName)
    {
      sprintf(szName, "%s", szPOIName);
    }
    int kx = sqlite3_column_int(stmt, 3);
    float x = sqlite3_column_double(stmt, 5);
  }
  sqlite3_finalize(stmt);

5 获取sql执行失败的错误信息
char* errMsg = NULL;
char* szSql = "select * from address";
nRet = sqlite3_exec(pDB, szSql, NULL, NULL ,&errMsg);
if (nRet != SQLITE_OK)
{
   cout<<errMsg<<endl;
   sqlite3_free(errMsg);
}
注意:释放errMsg指向的内存
6 关闭数据库
  sqlite3_close(db);


7迭代查询
char* pszSql = "select * from tableA where id >= ?"

当出现上面的sql语句的情况下,需要对?进行填充,这个时候就会
调用sqlite3_bind_int函数对该?进行填充

sqlite3_bind_int(stmt, 1, 2);

详细的说明:第二个参数表示对第一个?(可能有多个?),2表示填充到?
的值

对于使用回调和预编译语句获取记录集的方式比较
回调:一次性读取所有的记录集
预编译语句:每次使用sqlite3_step获取到一条记录了数据

代码:
    sqlite3_stmt *stmt = NULL;
    int ret = sqlite3_prepare();
    ret = sqlite3_bind_int(stmt, 1, id);
    ret = sqlite3_step(stmt);
    const char *mst = sqlite3_errstr(ret);

分析:
1)
    mst的错误提示:library routine called out of sequence
通过网上搜索是多线程访问数据库导致的问题,结果通读代码,发现没有多线程访问数据库,并且正常销毁stmt对象

2)
    尝试手动执行命令语句,出错提示如下:no such column:admin
说明SQL语句有问题,测试sqlite3_prepare函数的返回值,出错提示如下:SQL logic error or missing database。通过修改SQL语句,终于可以正常查询。

总结:sqlite3_prepare函数会分析SQL语句是否编写正确,如果不正确就会返回错误,导致下面的查询失败

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。