当前位置:   article > 正文

Linux C sqlite3安装步骤以及基本命令与相关函数_linux c程序移植 sqlite3详细步骤

linux c程序移植 sqlite3详细步骤

目录

sqlite3安装步骤

sqlite3基本命令

进入sqlite模式命令

系统命令(点命令--以"."开头)

sqlite语句(以";"结尾)

sqlite相关函数C/C++接口(头文件#include )

sqlite3_open()

sqlite3_close()

sqlite3_exec()

回调函数:

sqlite3_get_table()

sqlite3_free_table()

sqlite3_free()

代码示例

sqlite3_exec()回调与不回调查询数据库

sqlite3_get_table()不回调查询数据库


sqlite3安装步骤

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 进入sqlite模式,在命令提示行后输入

也可以直接sqlite3 数据库名 直接进入对应数据库,若该数据库不存在则就创建

系统命令(点命令--以"."开头)

①.help 帮助命令

②.quit 退出命令

③.show  查看 SQLite 命令提示符的默认设置

④.database (s)查看打开的数据库,以及他们的路径

⑤.open xx.db 打开对应的数据库,若不存在则创建

⑥.table(s) 查看对应数据库下的表(只显示表名)

⑦.schema 查看指定表的创建语句

sqlite语句(以";"结尾)

①增加 CREATE、INSERT、ALTER

  • 创建表 CREATE TABLE temperdata (id int, date char, temper char);
  • 插入数据 INSERT INTO "temperdata" VALUES(1, "2022-04-09", "28.5C");
  • 插入部分数据 INSERT INTO temperdata(id, temper) VALUES(2, "28.6C");
  • 添加一列 ALTER TABLE temperdata ADD place char

②删除 DROP、DELETE

  • 删除表 DROP TABLE temperdata
  • 删除表中某些记录 DELETE FROM temperdata WHERE id=1;
  • (删除数据库的话,可以直接把xx.db文件删除)

③修改 UPDATE

  • UPDATE temperdata SET temper=“29.1C” WHERE id=1;

④查看 SELECT

  • 查看整个表内容 SELECT * FROM "temperdata";
  • 查看表中的部分记录 SELECT date, temper FROM temperdata WHERE id=2;

sqlite相关函数C/C++接口(头文件#include <sqlite3.h>)

sqlite3_open()

int sqlite3_open(const char *filename, sqlite3 **ppDb);

功能描述:打开一个数据库,如果该数据库不存在,sqlite则会自动创建

参数解析:①第一个参数是特定文件名(xx.db)

                  ②第二个参数是sqlite3 **结构体指针,成为数据库句柄(相当于是数据库的描述符)

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)

  1. sqlite3 *db;
  2. sqlite3_open("temperdata.db", &db);

sqlite3_close()

int sqlite3_close(sqlite3 *)

功能描述:关闭之前调用的数据库连接,所有与连接相关的语句都应该在关闭之前完成

参数解析:就是先前连接定义的数据库句柄(相当于数据库描述符)

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值),其中如果是查询没有完成,则返回SQLITE_BUSY

  1. sqlite3 *db;
  2. sqlite3_close(db);

sqlite3_exec()

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_get_table()

注意:前面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),包括字段名

sqlite3_free_table()

void sqlite3_free_table(char **result)

功能描述:用来释放保存查询内容的指针数组

参数解析:是sqlite3_get_table()的第三个参数的查询结果

无返回值

sqlite3_free()

void sqlite3_free(void *)

功能描述:用来释放存放错误信息的内存空间,如果由错误发生,就要释放内存

参数描述:错误信息指针

无返回值

  1. char *zerrmsg;
  2. sqlite3_free(zerrmsg);

代码示例

sqlite3_exec()回调与不回调查询数据库

linyuting@Raspberrypi4B:~$vim test.c

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <sqlite3.h>
  5. #include <string.h>
  6. static int callback(void *para, int argc, char **argv, char **cname);
  7. int main(int argc, char **argv)
  8. {
  9. int rc = 0;
  10. sqlite3 *db = NULL;
  11. char *sql;
  12. char *sql1;
  13. char *sql2;
  14. char *sql3;
  15. char *data = "Callback function called";
  16. char *zerrmsg = NULL;
  17. //1、打开数据库,不存在,则创建它
  18. rc = sqlite3_open("testsqlite.db", &db);
  19. if( rc < 0 )
  20. {
  21. printf("open the database failure: %s\n", strerror(errno));
  22. return -1;
  23. }
  24. printf("open the testsqlite.db successfully.\n");
  25. //2、在该数据库中创建表,若表存在,则就不创建
  26. sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
  27. ID INT PRIMARY KEY,\
  28. NAME TEXT,\
  29. AGE INT\
  30. );";
  31. if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
  32. {
  33. printf("create the table failure: %s\n", strerror(errno));
  34. sqlite3_free(zerrmsg);
  35. return -2;
  36. }
  37. printf("create the table successfully.\n");
  38. //3、往表中插入数据,这是sqlite3_exec()非回调的使用
  39. sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
  40. if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
  41. {
  42. printf("insert the message into table failure: %s\n", strerror(errno));
  43. sqlite3_free(zerrmsg);
  44. return -3;
  45. }
  46. printf("insert the message into table successfully.\n");
  47. sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
  48. if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
  49. {
  50. printf("insert the message into table failure: %s\n", strerror(errno));
  51. sqlite3_free(zerrmsg);
  52. return -4;
  53. }
  54. printf("insert the message into table successfully.\n");
  55. //4.从表中查询数据,这是sqlite3_exec()回调的调用
  56. sql3 = "SELECT * FROM STUDENT";
  57. if( sqlite3_exec(db, sql3, callback, (void *)data, &zerrmsg) != SQLITE_OK )
  58. {
  59. printf("select from table failure: %s\n", strerror(errno));
  60. sqlite3_free(zerrmsg);
  61. return -5;
  62. }
  63. printf("select from table successfully.\n");
  64. sqlite3_close(db);
  65. return 0;
  66. }
  67. //回调函数
  68. static int callback(void *para, int argc, char **argv, char **cname)
  69. {
  70. int i;
  71. printf("%s\n", (char *)para);
  72. printf("the table column is %d\n", argc);
  73. for(i=0; i<argc; i++)
  74. {
  75. printf("%s = %s\n", cname[i], argv[i] ? argv[i] : NULL);
  76. }
  77. printf("\n");
  78. return 0;
  79. }

linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3(注意在编译的时候一定要加上-sqlite3,包含相关的头文件,否则会出错)

linyuting@Raspberrypi4B:~$./test

由此可见,因为有两条记录,相当于输出两行,所以回调函数执行两次

sqlite3_get_table()不回调查询数据库

linyuting@Raspberrypi4B:~$vim test.c

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <sqlite3.h>
  5. #include <string.h>
  6. int main(int argc, char **argv)
  7. {
  8. int rc = 0;
  9. int i = 0;
  10. sqlite3 *db = NULL;
  11. char *sql;
  12. char *sql1;
  13. char *sql2;
  14. char *sql3;
  15. char **result;
  16. int nrow = 0;
  17. int ncolumn = 0;
  18. char *zerrmsg = NULL;
  19. //1、打开数据库,不存在,则创建它
  20. rc = sqlite3_open("testsqlite.db", &db);
  21. if( rc < 0 )
  22. {
  23. printf("open the database failure: %s\n", strerror(errno));
  24. return -1;
  25. }
  26. printf("open the testsqlite.db successfully.\n");
  27. //2、在该数据库中创建表
  28. sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
  29. ID INT PRIMARY KEY,\
  30. NAME TEXT,\
  31. AGE INT\
  32. );";
  33. if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
  34. {
  35. printf("create the table failure: %s\n", strerror(errno));
  36. sqlite3_free(zerrmsg);
  37. return -2;
  38. }
  39. printf("create the table successfully.\n");
  40. //3.往表中插入数据,这是sqlite3_exec()非回调的使用
  41. sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
  42. if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
  43. {
  44. printf("insert the message into table failure: %s\n", strerror(errno));
  45. sqlite3_free(zerrmsg);
  46. return -3;
  47. }
  48. printf("insert the message into table successfully.\n");
  49. sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
  50. if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
  51. {
  52. printf("insert the message into table failure: %s\n", strerror(errno));
  53. sqlite3_free(zerrmsg);
  54. return -4;
  55. }
  56. printf("insert the message into table successfully.\n");
  57. //4、查询表中数据,这里使用的是sqlite3_get_table()非回调方法
  58. sql3 = "SELECT * FROM STUDENT";
  59. if( sqlite3_get_table(db, sql3, &result, &nrow, &ncolumn, &zerrmsg) != SQLITE_OK )
  60. {
  61. printf("select from table failure: %s\n", strerror(errno));
  62. sqlite3_free(zerrmsg);
  63. return -5;
  64. }
  65. printf("select from table successfully.\n");
  66. printf("the total row is %d, column is %d\n", nrow, ncolumn);
  67. printf("the result is:\n");
  68. //将查询到的结果,通过数组遍历出来
  69. for(i=0; i<(nrow+1)*(ncolumn); i++)
  70. {
  71. printf("%s\n", result[i]);
  72. }
  73. sqlite3_close(db);
  74. return 0;
  75. }

linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3

linyuting@Raspberrypi4B:~$./test

 由此可见,sqlite3_get_table()非递归调用的代码没有sqlite3_exec()递归调用显得整齐。

               

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/173241
推荐阅读
相关标签
  

闽ICP备14008679号