赞
踩
目录
sqlite相关函数C/C++接口(头文件#include )
sqlite3版本:sqlite-autoconf-3310100
平台:ubuntu
以下操作需要sudo权限
①从官网下载对应的压缩包
lyt598@ubuntu:~$ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
②对压缩包进行解压
lyt598@ubuntu:~$ tar -xzvf sqlite-autoconf-3310100.tar.gz
③进入到解压的文件夹内
lyt598@ubuntu:~$cd sqlite-autoconf-3310100/
④运行相应的配置文件
lyt598@ubuntu:~/sqlite-autoconf-3310100$ ./configure
⑤执行make命令,这一步比较慢,进行编译源程序,请耐心等待
lyt598@ubuntu:~/sqlite-autoconf-3310100$ make
注:如果这步执行有误,可以先执行make clean,先清除之前安装的sqlite3
⑥执行make install命令,需要sudo权限进行安装,否则会出错
lyt598@ubuntu:~/sqlite-autoconf-3310100$ sudo make install
./configure、make、make install相关命令解析
sqlite3 进入sqlite模式,在命令提示行后输入
也可以直接sqlite3 数据库名 直接进入对应数据库,若该数据库不存在则就创建
①.help 帮助命令
②.quit 退出命令
③.show 查看 SQLite 命令提示符的默认设置
④.database (s)查看打开的数据库,以及他们的路径
⑤.open xx.db 打开对应的数据库,若不存在则创建
⑥.table(s) 查看对应数据库下的表(只显示表名)
⑦.schema 查看指定表的创建语句
①增加 CREATE、INSERT、ALTER
②删除 DROP、DELETE
③修改 UPDATE
④查看 SELECT
int sqlite3_open(const char *filename, sqlite3 **ppDb);
功能描述:打开一个数据库,如果该数据库不存在,sqlite则会自动创建
参数解析:①第一个参数是特定文件名(xx.db)
②第二个参数是sqlite3 **结构体指针,成为数据库句柄(相当于是数据库的描述符)
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
- sqlite3 *db;
- sqlite3_open("temperdata.db", &db);
int sqlite3_close(sqlite3 *)
功能描述:关闭之前调用的数据库连接,所有与连接相关的语句都应该在关闭之前完成
参数解析:就是先前连接定义的数据库句柄(相当于数据库描述符)
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值),其中如果是查询没有完成,则返回SQLITE_BUSY
- sqlite3 *db;
- sqlite3_close(db);
int sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **),
void *data, char **errmsg)
功能描述:编译和执行sql语句,将查询到的结果返回给回调函数callback
参数解析:
①第一个参数是打开的数据库句柄
②第二个参数是一个字符指针,表示所要执行的sql语句字符串,以'\0'结尾
③第三个参数是一个回调函数,用来处理查询结果,如果不需要回调则NUL填L(比如insert或delete操作时),一般用于SELECT
④第四个参数是传给回调函数的指针参数,如果不需要传递,则值填NULL
⑤第五个参数是返回错误信息,这里是指针的指针
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
注意:使用回调会显得代码整齐
回调函数:是由函数指针调用的函数。
在c代码编程中可以这样理解,函数F1调用函数F2的时候,通过参数给函数F2传递了另一个函数F3的指针,在函数F2执行的时候,函数F2调用了F3,这个动作叫做回调(Callback),而先被当作指针参数传入、然后又被回调的函数F3就是回调函数(也叫钩子函数Hook)
typedef int (*sqlite_callback)(void *para, int columncount, char **columnvalue,
char **columnname);
功能描述:由用户处理查询的结果
参数解析:
①第一个参数para指针,是sqlite3_exec()传入的指针参数
②第二个参数columncount是查询到的这一条记录共有多少个字段(相当于多少列)
③第三个参数columnvalue将查询出来的数据都保持在这里,这是一个一维数组,每一个元素都是一个char *值,是一个字段内容(用字符串来表示)
④第四个参数columnname是与columnvalue对应的,也是一个一维数组,代表这个字段名称
返回值:执行成功则返回SQLITE_OK(0),否则返回其他值(非0)
PS:回调函数执行一次或n次,大多数情况下是会循环执行n次。当我们进行SELSCT查询的时候,输出的结果有几行,就会执行几次回调函数
注意:前面sqlite3_exec()使用回调会显得代码整齐,但是有时候想要使用非回调的SELECT查询,就可以使用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 */ );
功能描述:主要是用于以非回调的方式进行SELECT查询
参数解析:
①第一个参数是一个数据库句柄,是打开数据库得到的指针
②第二个参数是一条sql语句,与sqlite3_exec()中的一样,以'\0'结尾的字符串
③第三个参数是查询的结果,是一个一维数组,它的内存布局是:字段名称,后面是紧接着每个字段的值(就是列表名,后面跟着一个一个数据)
④第四个参数是查询出多少条记录(即查出多少行,不包括字段名的那一行)
⑤第五个参数是有多少字段(多少列)
⑥第五个参数是返回错误信息,这里是指针的指针
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
注意:第三个参数pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),包括字段名
void sqlite3_free_table(char **result)
功能描述:用来释放保存查询内容的指针数组
参数解析:是sqlite3_get_table()的第三个参数的查询结果
无返回值
void sqlite3_free(void *)
功能描述:用来释放存放错误信息的内存空间,如果由错误发生,就要释放内存
参数描述:错误信息指针
无返回值
- char *zerrmsg;
- sqlite3_free(zerrmsg);
linyuting@Raspberrypi4B:~$vim test.c
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <sqlite3.h>
- #include <string.h>
-
- static int callback(void *para, int argc, char **argv, char **cname);
-
- int main(int argc, char **argv)
- {
- int rc = 0;
- sqlite3 *db = NULL;
- char *sql;
- char *sql1;
- char *sql2;
- char *sql3;
- char *data = "Callback function called";
- char *zerrmsg = NULL;
-
-
- //1、打开数据库,不存在,则创建它
- rc = sqlite3_open("testsqlite.db", &db);
- if( rc < 0 )
- {
- printf("open the database failure: %s\n", strerror(errno));
- return -1;
- }
- printf("open the testsqlite.db successfully.\n");
-
- //2、在该数据库中创建表,若表存在,则就不创建
- sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
- ID INT PRIMARY KEY,\
- NAME TEXT,\
- AGE INT\
- );";
- if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("create the table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -2;
- }
- printf("create the table successfully.\n");
-
-
- //3、往表中插入数据,这是sqlite3_exec()非回调的使用
- sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
- if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("insert the message into table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -3;
- }
- printf("insert the message into table successfully.\n");
-
- sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
- if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("insert the message into table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -4;
- }
- printf("insert the message into table successfully.\n");
-
-
- //4.从表中查询数据,这是sqlite3_exec()回调的调用
- sql3 = "SELECT * FROM STUDENT";
- if( sqlite3_exec(db, sql3, callback, (void *)data, &zerrmsg) != SQLITE_OK )
- {
- printf("select from table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -5;
- }
- printf("select from table successfully.\n");
-
- sqlite3_close(db);
- return 0;
- }
-
- //回调函数
- static int callback(void *para, int argc, char **argv, char **cname)
- {
- int i;
-
- printf("%s\n", (char *)para);
- printf("the table column is %d\n", argc);
- for(i=0; i<argc; i++)
- {
- printf("%s = %s\n", cname[i], argv[i] ? argv[i] : NULL);
- }
- printf("\n");
-
- return 0;
- }
linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3(注意在编译的时候一定要加上-sqlite3,包含相关的头文件,否则会出错)
linyuting@Raspberrypi4B:~$./test
由此可见,因为有两条记录,相当于输出两行,所以回调函数执行两次。
linyuting@Raspberrypi4B:~$vim test.c
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <sqlite3.h>
- #include <string.h>
-
-
- int main(int argc, char **argv)
- {
- int rc = 0;
- int i = 0;
- sqlite3 *db = NULL;
- char *sql;
- char *sql1;
- char *sql2;
- char *sql3;
- char **result;
- int nrow = 0;
- int ncolumn = 0;
- char *zerrmsg = NULL;
-
- //1、打开数据库,不存在,则创建它
- rc = sqlite3_open("testsqlite.db", &db);
- if( rc < 0 )
- {
- printf("open the database failure: %s\n", strerror(errno));
- return -1;
- }
- printf("open the testsqlite.db successfully.\n");
-
-
- //2、在该数据库中创建表
- sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
- ID INT PRIMARY KEY,\
- NAME TEXT,\
- AGE INT\
- );";
- if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("create the table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -2;
- }
- printf("create the table successfully.\n");
-
- //3.往表中插入数据,这是sqlite3_exec()非回调的使用
- sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
- if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("insert the message into table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -3;
- }
- printf("insert the message into table successfully.\n");
-
- sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
- if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
- {
- printf("insert the message into table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -4;
- }
- printf("insert the message into table successfully.\n");
-
-
- //4、查询表中数据,这里使用的是sqlite3_get_table()非回调方法
- sql3 = "SELECT * FROM STUDENT";
- if( sqlite3_get_table(db, sql3, &result, &nrow, &ncolumn, &zerrmsg) != SQLITE_OK )
- {
- printf("select from table failure: %s\n", strerror(errno));
- sqlite3_free(zerrmsg);
- return -5;
- }
- printf("select from table successfully.\n");
-
- printf("the total row is %d, column is %d\n", nrow, ncolumn);
- printf("the result is:\n");
-
- //将查询到的结果,通过数组遍历出来
- for(i=0; i<(nrow+1)*(ncolumn); i++)
- {
- printf("%s\n", result[i]);
- }
-
- sqlite3_close(db);
- return 0;
- }
linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3
linyuting@Raspberrypi4B:~$./test
由此可见,sqlite3_get_table()非递归调用的代码没有sqlite3_exec()递归调用显得整齐。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。