sqlite3——sqlite3应用相关函数

简介: sqlite3——sqlite3应用相关函数

sqlite3应用相关函数


1、打开数据库:sqlite3_open


原型:


int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);


函数功能:打开或创建数据库


参数说明:


filename – 数据库文件名(相对或绝对路径),


如果该文件不存在,则该函数会创建该数据库文件并打开


如果该文件存在,则打开它


ppDb–返回的数据库句柄,所有与该数据库相关的操作都要基于该句柄来执行


返回值:SQLITE_OK(SQLITE_OK的值为0)则表示操作正常


2、关闭数据库:sqlite3_close


原型:


int sqlite3_close(sqlite3 *ppDb);
ppDb--数据库句柄


3、执行sql操作:sqlite3_exec


原型:


int sqlite3_exec(
  sqlite3* ppDb,                             /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);


函数功能:执行一条sql 语句的函数


  • 第1个参数ppDb,数据库句柄


  • 第2个参数constchar*sql,是一条sql 语句,以\0结尾。


  • 第3个参数sqlite3_callback ,是回调函数,当SQL语句执行完毕后,会自动调用。如果SQL语句不需要处理返回数据,则可以置为NULL


  • 第4个参数void*是你所提供的指针,该参数作为上面这个回调函数的参数,可以作为回调函数的一个输入。不需要时可以置为NULL


  • 第5个参数char** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec 之后,执行失败时可以查阅这个指针(直接cout<<errmsg得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。


说明:通常,sqlite3_callback 和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。


exec 的回调


typedef int(*sqlite3_callback)(void*,int,char**,char**);


你的回调函数必须定义成上面这个函数的类型。


sqlite 每查到一条记录,就调用一次这个回调


例如:


int LoadMyInfo(void* para,intn_column,char** column_value,char** column_name);


para–是你在sqlite3_exec 里传入的void参数通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void类型,必须强制转换成你的类型才可用)。然后操作这些数据


n_column–是这一条记录有多少个字段(即这条记录有多少列)


char** column_value --是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个char*值,是一个字段内容(用字符串来表示,以\0结尾)


char** column_name 跟column_value是对应的,表示每个字段的字段名称


4、非回调方式的数据库访问:sqlite3_get_table


原型:


int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);


参数说明:


  • db–数据库句柄


  • zSql–要执行的的SQL语句,以’\0’结尾


  • pazResult–返回的查询数据,一维数组,从pazResult[0]起一行一行的保存数据,其中第一行是各列的字段名称,从第二行起是各列的具体数据。不论该函数执行是否成功,都需要调用 sqlite3_free_table函数释放。


  • pnRow–返回多少行数据(不包括第一行表头信息)


  • pnColumn–返回多少列数据,因为pazResult中第一行是表头信息,因此数据从pazResult[pnColumn]开始


  • pzErrmsg–错误信息,和sqlite3_exec 的相同


返回值:成功返回SQLITE_OK —0


5、释放函数sqlite3_get_table返回的结果内存:sqlite3_free_table


原型:


 void sqlite3_free_table(char **result);


函数功能:释放函数sqlite3_get_table返回的查询数据pazResult的内存


result–sqlite3_get_table返回的查询数据pazResult


案例


#include <iostream>
using namespace std;
#include "sqlite/sqlite3.h"
int callback(void*,int,char**,char**);
int main()
{
    sqlite3* db;
    int nResult = sqlite3_open("test.db",&db);
    if (nResult != SQLITE_OK)
    {
        cout<<"打开数据库失败:"<<sqlite3_errmsg(db)<<endl;
        return 0;
    }
    else
    {
        cout<<"数据库打开成功"<<endl;
    }
    char* errmsg;
    nResult = sqlite3_exec(db,"create table abc(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
     if (nResult != SQLITE_OK)
     {
         sqlite3_close(db);
         cout<<errmsg;
         sqlite3_free(errmsg);
        return 0;
    }
    string strSql;
    strSql+="begin;\n";
    for (int i=0;i<100;i++)
    {
        strSql+="insert into abc values(null,'heh');\n";
    }
    strSql+="commit;";
    //cout<<strSql<<endl;
    nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);
    if (nResult != SQLITE_OK)
    {
        sqlite3_close(db);
        cout<<errmsg<<endl;
        sqlite3_free(errmsg);
        return 0;
    }
    strSql = "select * from abc";
    //nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);
    char** pResult;
    int nRow;
    int nCol;
    nResult = sqlite3_get_table(db,strSql.c_str(),&pResult,&nRow,&nCol,&errmsg);
      if (nResult != SQLITE_OK)
    {
        sqlite3_close(db);
        cout<<errmsg<<endl;
        sqlite3_free(errmsg);
        return 0;
    }
    string strOut;
    int nIndex = nCol;
    for(int i=0;i<nRow;i++)
    {
        for(int j=0;j<nCol;j++)
        {
            strOut+=pResult[j];
            strOut+=":";
            strOut+=pResult[nIndex];
            strOut+="\n";
            ++nIndex;
        }
    }
    sqlite3_free_table(pResult);
    cout<<strOut<<endl;
    sqlite3_close(db);
    return 0;
}


相关文章
|
7月前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
306 0
|
4月前
|
存储 关系型数据库 MySQL
SQLite的应用场景有哪些?
【8月更文挑战第21天】SQLite的应用场景有哪些?
298 3
|
4月前
|
Linux 测试技术 数据库
解决django与sqlite3不兼容报SQLite 3.9.0 or later is required (found 3.8.2)错的问题
解决django与sqlite3不兼容报SQLite 3.9.0 or later is required (found 3.8.2)错的问题
186 2
|
7月前
|
存储 关系型数据库 数据库
利用Python与SQLite构建轻量级数据库应用
在当今日益增长的数据处理需求下,数据库成为存储、检索和管理数据的关键技术。然而,对于小型项目或快速原型开发,大型数据库系统可能显得过于庞大和复杂。本文将介绍如何利用Python编程语言与SQLite轻量级数据库,快速搭建一个功能齐全、易于维护的数据库应用。我们将探讨SQLite数据库的特点、Python对SQLite的支持,并通过一个实际案例展示如何构建一个简单的数据库应用,为读者提供一种高效、灵活的解决方案。
|
7月前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
7月前
|
数据库连接 API 数据库
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
340 0
|
7月前
|
SQL Dart 数据库
Flutter笔记: 在Flutter应用中使用SQLite数据库
Flutter笔记: 在Flutter应用中使用SQLite数据库
1095 0
|
7月前
|
SQL 关系型数据库 MySQL
mysql转sqlite3实战+部署sqlite3应用
mysql转sqlite3实战+部署sqlite3应用
510 0
|
7月前
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
98 0
|
6月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
292 2