温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQLite第三课 使用例子

发布时间:2020-09-06 05:50:46 来源:网络 阅读:520 作者:fengyuzaitu 栏目:软件技术

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语句是否编写正确,如果不正确就会返回错误,导致下面的查询失败


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI