Linux 嵌入式开发学习day6:数据库操作图文详解

【1】 UNIX域套接字     本地的进程间通信     s   socket           前5天的内容TCP,UDP 都是依赖IP 端口号进行通信的          struct sockaddr_in serveradd; //网络信息结构体  internet          unix域套接字编程,实现本间进程的通信, 依赖的是s类型的文件;      服务器端:            1. socket(AF_UNIX, SOCK_STREAM, 0)                                        填充结构体:             struct sockaddr_un serveradd;  //unix                          struct sockaddr_un {                 __kernel_sa_family_t sun_family; /* AF_UNIX */                 char sun_path[UNIX_PATH_MAX];   /* pathname */             };                           用法:             struct sockaddr_un serveraddr;             serveraddr.sun_family = AF_UNIX;             strcpy(serveraddr.sun_path,"myunixfile");                             2.  bind(,本地地址, )            3. listen(,)            4. accept(,,)            5.  recv() / send() 用法实例: Linux 嵌入式开发学习day6:数据库操作图文详解 客户端:          1. socket(AF_UNIX, SOCK_STREAM, 0)          2. 填充struct sockaddr_un 结构体          3. connect(,,)          4.  recv() / send()             …… 用法实例: Linux 嵌入式开发学习day6:数据库操作图文详解          unlink("myunixtcp");//可重复利用链接文件     htons()          htonl(INADDR_ANY);      【2】 数据库          sqlite3          sqlite3 安装:         1. sudo dpkg -i *.deb  离线安装                  2. 在线安装             1、设置能够上网             2、更新更新源             # sudo apt-get update                      3、安装软件及开发环境             # apt-get install sqlite3        --->sqlite3数据库软件             # apt-get install libsqlite3-dev    --->sqlite3数据库开发支持库             # apt-get install sqlite3-doc        --->sqlite3数据库说明文档         --------------------------------                  # sudo apt-get install sqlitebrowser                     --->sqlite3数据库操作软件               测试是否安装成功:         SQLite version 3.7.9         Enter ".help" for instructions         Enter SQL statements terminated with a ";"         sqlite>                  如果出现以上内容,表示安装成功; 【3】 操作数据库     {1}. 命令的方式操作         sqlite3 数据库文件名(stu.db)              两种命令:     1. sqlite3系统命令         都是以 '.' 开头的         a.   .help  查看所有支持的命令         b.   .quit  退出         c.   .tables  查看有哪些表         d.   .schema stu2  查看表结构     2. SQL命令         SQL命令是以 “;” 结尾          1. 创建一个表.out         create table stu(id int,name char,score float); Linux 嵌入式开发学习day6:数据库操作图文详解          create table stu(id int primary key, name char, score float);         注:把id字段设置为主键(在表中唯一);                          字符串:char string text             小数:float real             不支持严格的类型检查的;                   2. 删除一个表             drop  table  <table_name>;                          ...>;              Linux 嵌入式开发学习day6:数据库操作图文详解          3. 向表里面插入数据         insert  into  <table_name>  values(value1, value2,…);         insert into stu values(1,"xiaomingx",99.9);          Linux 嵌入式开发学习day6:数据库操作图文详解         //只插入部分字段    id  name  score         insert into stu(id,name) values(4,'xiaoming');              Linux 嵌入式开发学习day6:数据库操作图文详解          4. 查找数据         查询表中所有记录          select  *  from  <table_name>;      Linux 嵌入式开发学习day6:数据库操作图文详解         按指定条件查询表中记录         select  *  from  <table_name>  where  <expression>; Linux 嵌入式开发学习day6:数据库操作图文详解         select * from stu where id=2;         select * from stu where id=2 and name='lisi';         select * from stu where id=1 or name='zhangsan';                  select score from stu where name='LiSi' or id=3; //限定条件查询 Linux 嵌入式开发学习day6:数据库操作图文详解         select name,score from stu where name='LiSi' or id=3;                      select * from stu limit 5;   //只查询前n条记录 Linux 嵌入式开发学习day6:数据库操作图文详解         select * from stu order by id desc; //按id从大到小进行排序 Linux 嵌入式开发学习day6:数据库操作图文详解                   5. 修改(更新)数据          update  <table_name>  set  <f1=value1>, <f2=value2>…   where  <expression>;           update stu set     id=10 where id=1; Linux 嵌入式开发学习day6:数据库操作图文详解                   6. 增加字段          alter table <table> add column <field> <type> default  …;         alter table stu add column class int default 1; Linux 嵌入式开发学习day6:数据库操作图文详解                7.删除字段操作         1)create table student as select id,name,score from stu;             创建一个student表,从stu表当中复制id,name,score         2) drop table stu;             删除原有的stu表         3) alter table student rename to stu;             重命名 Linux 嵌入式开发学习day6:数据库操作图文详解          {2} . C代码的方式操作sqlite          sqlite3API接口查询地址:      https://www.sqlite.org/c3ref/sqlite3.html :         Linux 嵌入式开发学习day6:数据库操作图文详解      int   sqlite3_open(char  *path,   sqlite3 **db);             功能:打开sqlite数据库       参数:         path: 数据库文件路径                  db: 指向sqlite句柄的指针               返回值:成功返回0,失败返回错误码(非零值)                   sqlite3 *db;          sqlite3_open("stu.db",&db);              值传递:   获取到值     地址传递: 修改值得使用地址传递     ==========================================      int   sqlite3_close(sqlite3 *db);        功能:关闭sqlite数据库                   返回值:成功返回0,失败返回错误码                    sqlite3_close(db);          ==========================================           const  char  *sqlite3_errmsg(sqlite3 *db);               返回值:返回错误信息          perror("open failed.");              fprintf(stderr,"sqlite3_open failed %s\n",sqlite3_errmsg(db));               =================================     注意编译时出现以下问题:     linux@ubuntu:~/1907-net/day6/sqlite3$ gcc 1_sqlite3.c     /tmp/ccDbTidR.o: In function `main':     1_sqlite3.c:(.text+0x19): undefined reference to `sqlite3_open'     1_sqlite3.c:(.text+0x29): undefined reference to `sqlite3_errmsg'     1_sqlite3.c:(.text+0x5c): undefined reference to `sqlite3_close'     collect2: ld returned 1 exit status          应该链接库:          gcc 1_sqlite3.c -lsqlite3 Linux 嵌入式开发学习day6:数据库操作图文详解              =====================================     typedef  int (*sqlite3_callback)(void *, int, char **, char **);          sqlite3_callback   int (*)(void *, int, char **, char **)               int sqlite3_exec(sqlite3 *db , const  char   *sql ,  sqlite3_callback callback , void *arg ,  char **errmsg );       非查询时:                           (句柄)                                                                      (NULL)          (NULL)      功能:执行SQL语句                   db:数据库句柄          sql:SQL语句 ("create table stu .....;")          callback:回调函数          void * arg:(给回调函数传的参数)             当使用查询命令的时候,callback和arg才有意义;             select .....                       errmsg:错误信息指针的地址              char *errmsg;                  &errmsg;                   返回值:成功返回0,失败返回错误码          举个例子:         创建一个stu表     sqlite3_exec(db,"create table stu(id int,name char,score float);"                 NULL,NULL,&errmsg);      Linux 嵌入式开发学习day6:数据库操作图文详解 ============================================================      int callback(void *para, int f_num, char **f_value, char **f_name);     功能: 每找到一条记录自动执行一次回调函数
id name score
1 运才 10.2
2 一文 12.1
        para:   传递给回调函数的参数         f_num:  记录中包含的字段数目(id name score)                  相当于有多少列;         f_value:包含每个字段值的指针数组         f_name:包含每个字段名称的指针数组 callback函数: Linux 嵌入式开发学习day6:数据库操作图文详解 用sqlite3_exec实现select: Linux 嵌入式开发学习day6:数据库操作图文详解              返回值:成功返回0,失败返回-1      ================================================================         char sql[128];         int id = 1;         char *name = "zhaoliu";         float score = 88.8;                                                                                              sprintf(sql,"insert into stu values(%d,\"%s\",%f);",id,name,score);         if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != 0) =================================================================          不使用回调函数执行SQL语句     int  sqlite3_get_table(sqlite3 *db, const  char  *sql, char ***resultp,  int *nrow,  int *ncolumn, char **errmsg);     功能:执行SQL操作            db:数据库句柄     sql:SQL语句          resultp:用来指向sql执行结果的指针;实际上就是“指针数组指针”;     nrow:满足条件的记录的数目,实际上就是有多少行数据;     ncolumn:每条记录包含的字段数目,实际上就是有多少个字段(多少列);          errmsg:错误信息指针的地址       返回值:成功返回0,失败返回错误码、、 Linux 嵌入式开发学习day6:数据库操作图文详解                                                                                               
上一篇:day6-加密md5


下一篇:互斥元如何泄漏受保护数据