• 网络编程 day05 (linux )数据库 sqlite3 的下载 与使用命令,和在程序中运用sqlite3


    1.下载sqlite3的命令: (终端上输入)

    sudo apt-get install sqlite3


    2.下载sqlite3的插件 : (终端上输入)

    sudo apt-get install libsqlite3


    3.显示所有命令(前面的sqlite> 是电脑上的提示符号) (命令的前面都有一个

    sqlite> .help  

    4.退出sqlite3(前面的sqlite> 是电脑上的提示符号) (命令的前面都有一个

    sqlite>.quit

    5.显示当前打开的数据库文件(前面的sqlite> 是电脑上的提示符号) (命令的前面都有一个

    sqlite>.database

    6.显示数据库中所有表名(前面的sqlite> 是电脑上的提示符号)  (命令的前面都有一个

    sqlite>.tables

    7.查看表的结构(前面的sqlite> 是电脑上的提示符号)  (命令的前面都有一个

    sqlite>.schema        (不填最后这个是 显示所有的表)

    8.创建新表( 前面的sqlite> 是电脑上的提示符号)  (语句的后面都有一个分号 ;

    sqlite>create   table  studen_table(Stu_no interger primary  key , Name text not null, Id interger unique, Age interger check(Age>6 and Age <10), School text  default  'xx小学' );
    该语句创建一个记录学生信息的数据表。

    3.1 sqlite3存储数据的类型
    NULL:标识一个NULL值(小写的也可以)
    INTERGER:整数类型(小写的也可以)
    REAL:浮点数(小写的也可以)
    TEXT:字符串(小写的也可以)
    BLOB:二进制数(小写的也可以)

    3.2 sqlite3存储数据的约束条件
    Sqlite常用约束条件如下:
    PRIMARY KEY ||  primary  key - 主键:
    1)主键的值必须唯一,用于标识每一条记录,如学生的学号
    2)主键同时也是一个索引,通过主键查找记录速度较快
    3)主键如果是整数类型,该列的值可以自动增长
    NOT NULL ||  not null- 非空:
    约束列记录不能为空,否则报错
    UNIQUE  ||  unique- 唯一:
    除主键外,约束其他列的数据的值唯一
    CHECK  ||  check- 条件检查:
    约束该列的值必须符合条件才可存入
    DEFAULT   || default - 默认值:
    列数据中的值基本都是一样的,这样的字段列可设为默认值
    列子:


    9.删除表(库函数后面都有一个分号 ;)

    sqlite>drop table

    10.查询表中所有记录
    sqlite>select * from ;
    例子:


    11.按指定条件查询表中记录
    sqlite>select * from    where   
    例子:


    12.向表中添加新记录
    sqlite>  insert into      values   (value1, value2,…);
    例子:


    13.按指定条件删除表中记录
    sqlite>delete  from     where   

    例子:


    14.在表中添加字段(添加表里面的元素)

    sqlite> alter table add column default …;
    例子:

    15.程序终端的的命令:(看代码:才能看懂)

    int sqlite3_open(char *path, sqlite3 **db)
    功能:打开 sqlite 数据库
    path : 数据库文件路径
    db : 指向 sqlite 句柄的指针
    返回值:成功返回 0 ,失败返回错误码 ( 非零值 )

    16.(看代码:才能看懂)

    int sqlite3_close(sqlite3 *db);
    功能:关闭 sqlite 数据库
    返回值:成功返回 0 ,失败返回错误码

    17.(看代码:才能看懂)

    const char *sqlite3_errmg(sqlite3 *db);
    返回值:返回错误信息

    18.(看代码:才能看懂)

    int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
    功能:执行 SQL 操作
    db :数据库句柄
    sql SQL 语句
    callback :回调函数
    errmsg :错误信息指针的地址
    返回值:成功返回 0 ,失败返回错误码

    19.(看代码:才能看懂)

    typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
    功能:每找到一条记录自动执行一次回调函数
    para :传递给回调函数的参数
    f_num :记录中包含的字段数目
    f_value :包含每个字段值的指针数组
    f_name :包含每个字段名称的指针数组
    返回值:成功返回 0 ,失败返回 -1

    20.
    不使用回调函数执行 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 ,失败返回错误码

    21代码: 实现上面的函数:(看代码:才能看懂)

    程序功能: 基本的写入信息;

    1. /************************************************************************************************************************************************************************************************************************
    2. *文件名:
    3. *作 者:She001
    4. *时 间:
    5. *版 本:
    6. *作 用:
    7. ****************************************************************************************************************************************************************************************************************************/
    8. #include<stdio.h>
    9. #include<string.h>
    10. #include<math.h>
    11. #include<stdlib.h>
    12. #include<stdbool.h>
    13. #include<time.h>
    14. #include<unistd.h>
    15. #include<sys/types.h>
    16. #include<sys/stat.h>
    17. #include<fcntl.h>
    18. #include<errno.h>
    19. #include<sys/wait.h>
    20. #include<a.out.h>
    21. #include<signal.h>
    22. #include<stdarg.h>
    23. #include<sys/socket.h>
    24. #include<utime.h>
    25. #include<sys/utsname.h>
    26. #include<sys/times.h>
    27. #include<sys/un.h>
    28. #include<ctype.h>
    29. #include<dirent.h>
    30. #include<sys/time.h>
    31. #include<sys/resource.h>
    32. #include<syslog.h>
    33. #include<pthread.h>
    34. #include<semaphore.h>
    35. #include<sys/time.h>
    36. #include<sys/ipc.h>
    37. #include<sys/sem.h>
    38. #include<sys/msg.h>
    39. #include<arpa/inet.h>
    40. #include<sys/socket.h>
    41. #include<netinet/in.h>
    42. #include<netdb.h>
    43. #include<sqlite3.h>
    44. #include<sys/select.h>
    45. #include<sys/poll.h>
    46. int main(int argc,char *argv[])
    47. {
    48. sqlite3 *studb =NULL;
    49. //下面这个函数 返回0 是执行成功
    50. int res =sqlite3_open(argv[1],&studb);// 打开数据库的函数   sqlite3 里面的 agrv[1] (参数传入)
    51. if(!res)
    52. {
    53. printf("sqlite3_Open ok\n");//打开成功
    54. }
    55. else
    56. {
    57. printf("sqlite_open error\n");//打开失败
    58. printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
    59. return -1;
    60. }
    61. //首先我们要在终端处创建一个 sqlite3
    62. //的数据库 (比如说 我创建了一个stu 的库 在里面 创建了学生的登陆信息记录表) 
    63. //终端 : sqlite3 stu.db
    64. //sqlite3> create table stu_xinxi(s_name text,s_ip text ,s_time text, s_caozuo text);  //建立一个表
    65. //sqlite3>.schema //查看是否创建成功
    66. //sqlite3>.save //保存 (报错不要管 ,但是实际上他帮你保存了)
    67. //sqlite3>.backup //备份(报错不要管)
    68. //sqlite3>.quit //退出sqit
    69. //
    70. //
    71. //
    72. //
    73. //再次进入stu.db 看看是否保存
    74. //终端: sqlite3 stu.db
    75. //sqlite3>.schema //查看表是否存在
    76. //有的话就成功了.
    77. char * errstr =NULL;
    78. //先写好操作sqlite3的库的命令
    79. const char * stup ="insert into stu_xinxi(s_name,s_ip,s_time,s_caozuo)values(\'帅哥\',\'192.168.1.162 \',\'13:12:12\',\'下线\');";
    80. //下面这个函数返回0 是执行成功
    81. if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
    82. {
    83. printf("opeation is suceessfuly \n");
    84. }
    85. else
    86. {
    87. printf("opeation is failed \n");
    88. printf("error: %s\n",errstr);
    89. }
    90. printf("dasdasdasd\n");
    91. sqlite3_close(studb);
    92. return 0;
    93. }


    22.读取数据库 

    功能:写入一个数据,之后读取库里面的所有数据

    代码:

    1. /************************************************************************************************************************************************************************************************************************
    2. *文件名:
    3. *作 者:She001
    4. *时 间:
    5. *版 本:
    6. *作 用:
    7. ****************************************************************************************************************************************************************************************************************************/
    8. #include<stdio.h>
    9. #include<string.h>
    10. #include<math.h>
    11. #include<stdlib.h>
    12. #include<stdbool.h>
    13. #include<time.h>
    14. #include<unistd.h>
    15. #include<sys/types.h>
    16. #include<sys/stat.h>
    17. #include<fcntl.h>
    18. #include<errno.h>
    19. #include<sys/wait.h>
    20. #include<a.out.h>
    21. #include<signal.h>
    22. #include<stdarg.h>
    23. #include<sys/socket.h>
    24. #include<utime.h>
    25. #include<sys/utsname.h>
    26. #include<sys/times.h>
    27. #include<sys/un.h>
    28. #include<ctype.h>
    29. #include<dirent.h>
    30. #include<sys/time.h>
    31. #include<sys/resource.h>
    32. #include<syslog.h>
    33. #include<pthread.h>
    34. #include<semaphore.h>
    35. #include<sys/time.h>
    36. #include<sys/ipc.h>
    37. #include<sys/sem.h>
    38. #include<sys/msg.h>
    39. #include<arpa/inet.h>
    40. #include<sys/socket.h>
    41. #include<netinet/in.h>
    42. #include<netdb.h>
    43. #include<sqlite3.h>
    44. #include<sys/select.h>
    45. #include<sys/poll.h>
    46. int main(int argc,char *argv[])
    47. {
    48. sqlite3 *studb =NULL;
    49. //下面这个函数 返回0 是执行成功
    50. int res =sqlite3_open(argv[1],&studb);// 打开数据库的函数   sqlite3 里面的 agrv[1] (参数传入)
    51. if(!res)
    52. {
    53. printf("sqlite3_Open ok\n");//打开成功
    54. }
    55. else
    56. {
    57. printf("sqlite_open error\n");//打开失败
    58. printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
    59. return -1;
    60. }
    61. //首先我们要在终端处创建一个 sqlite3
    62. //的数据库 (比如说 我创建了一个stu 的库 在里面 创建了学生的登陆信息记录表) 
    63. //终端 : sqlite3 stu.db
    64. //sqlite3> create table stu_xinxi(s_name text,s_ip text ,s_time text, s_caozuo text);  //建立一个表
    65. //sqlite3>.schema //查看是否创建成功
    66. //sqlite3>.save //保存 (报错不要管 ,但是实际上他帮你保存了)
    67. //sqlite3>.backup //备份(报错不要管)
    68. //sqlite3>.quit //退出sqit
    69. //
    70. //
    71. //
    72. //
    73. //再次进入stu.db 看看是否保存
    74. //终端: sqlite3 stu.db
    75. //sqlite3>.schema //查看表是否存在
    76. //有的话就成功了.
    77. char * errstr =NULL;
    78. //先写好操作sqlite3的库的命令
    79. const char * stup ="insert into stu_xinxi(s_name,s_ip,s_time,s_caozuo)values(\'帅哥\',\'192.168.1.162 \',\'13:12:12\',\'下线\');";
    80. //下面这个函数返回0 是执行成功
    81. if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
    82. {
    83. printf("opeation is suceessfuly \n");
    84. }
    85. else
    86. {
    87. printf("opeation is failed \n");
    88. printf("error: %s\n",errstr);
    89. }
    90. /读取库的信息
    91. char * look = "select * from stu_xinxi";//查看所有的列
    92. char ** paz_result;
    93. int hang;//用于存放获取到的总个数
    94. int lie;//用于存放一列表的个数
    95. //将数据库内容传到C变量里
    96. if (SQLITE_OK != sqlite3_get_table(studb,look,&paz_result,&hang,&lie,&errstr))
    97. {
    98. //打印错误信息
    99. fprintf(stderr,"数据库操作错误\n%s\n",errstr); //输入到标准报错里面
    100. //释放掉错误区域内存,防止内存溢出
    101. sqlite3_free(errstr);
    102. return -3;
    103. }
    104. printf("一共有%d行,每行参数%d个(列)\n",hang,lie);
    105. printf("\n\n详细信息\n");
    106. int i,j,index = 0;
    107. for ( i = 0; i <= hang; i++)//默认会少打印一行,所以 i <= hang
    108. {
    109. for ( j = 0; j < lie; j++)
    110. {
    111. printf("%s\t",paz_result[index]);
    112. index ++;
    113. }
    114. printf("\n");
    115. }
    116. sqlite3_close(studb);
    117. return 0;
    118. }


    23.封装之后的程序

    代码:

    1. /************************************************************************************************************************************************************************************************************************
    2. *文件名:
    3. *作 者:She001
    4. *时 间:
    5. *版 本:
    6. *作 用:
    7. ****************************************************************************************************************************************************************************************************************************/
    8. #include<stdio.h>
    9. #include<string.h>
    10. #include<math.h>
    11. #include<stdlib.h>
    12. #include<stdbool.h>
    13. #include<time.h>
    14. #include<unistd.h>
    15. #include<sys/types.h>
    16. #include<sys/stat.h>
    17. #include<fcntl.h>
    18. #include<errno.h>
    19. #include<sys/wait.h>
    20. #include<a.out.h>
    21. #include<signal.h>
    22. #include<stdarg.h>
    23. #include<sys/socket.h>
    24. #include<utime.h>
    25. #include<sys/utsname.h>
    26. #include<sys/times.h>
    27. #include<sys/un.h>
    28. #include<ctype.h>
    29. #include<dirent.h>
    30. #include<sys/time.h>
    31. #include<sys/resource.h>
    32. #include<syslog.h>
    33. #include<pthread.h>
    34. #include<semaphore.h>
    35. #include<sys/time.h>
    36. #include<sys/ipc.h>
    37. #include<sys/sem.h>
    38. #include<sys/msg.h>
    39. #include<arpa/inet.h>
    40. #include<sys/socket.h>
    41. #include<netinet/in.h>
    42. #include<netdb.h>
    43. #include<sqlite3.h>
    44. #include<sys/select.h>
    45. #include<sys/poll.h>
    46. void sqlite3_input(char *a,char *b,char *c,char *d )//把用户接受的 写入数据库 a ip  b port c : name d : 信息
    47. {
    48. sqlite3 *studb =NULL;
    49. //下面这个函数 返回0 是执行成功
    50. int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数   sqlite3 里面的 agrv[1] (参数传入)
    51. if(!res)
    52. {
    53. //printf("sqlite3_Open ok\n");//打开成功
    54. }
    55. else
    56. {
    57. printf("sqlite_open error\n");//打开失败
    58. printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
    59. return ;
    60. }
    61. char * errstr =NULL;
    62. //先写好操作sqlite3的库的命令
    63. //const char * stup ="insert into qq_ip_port(q_name, q_information )values(\'帅哥\',\'下线\');";
    64. char stup[1024]="";
    65. strcat(stup,"insert into qq_");
    66. strcat(stup,"stu1");
    67. strcat(stup,"_");
    68. strcat(stup,b);
    69. strcat(stup,"(q_name,q_information)values(\'");
    70. strcat(stup,c);
    71. strcat(stup,"\',\'");
    72. strcat(stup,d);
    73. strcat(stup,"\');");
    74. //printf("%s\n",stup);
    75. //下面这个函数返回0 是执行成功
    76. if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
    77. {
    78. //printf("opeation is suceessfuly \n");
    79. }
    80. else
    81. {
    82. printf("opeation is failed \n");
    83. printf("error: %s\n",errstr);
    84. }
    85. sqlite3_close(studb);
    86. }
    87. void create_table_stu1(char* a,char *b)//a: ip b:port //创造一个表
    88. {
    89. sqlite3 *studb =NULL;
    90. //下面这个函数 返回0 是执行成功
    91. int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数   sqlite3 里面的 agrv[1] (参数传入)
    92. if(!res)
    93. {
    94. // printf("sqlite3_Open ok\n");//打开成功
    95. }
    96. else
    97. {
    98. //printf("sqlite_open error\n");//打开失败
    99. // printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
    100. return ;
    101. }
    102. char * errstr =NULL;
    103. //char * create_table ="create table qq_ip_port(q_name text , q_information text);";
    104. char create_table[1024]="";
    105. char ip1[1024]="";
    106. char port1[1024]="";
    107. strcat(ip1,a);//ip
    108. strcat(port1,b);//port
    109. strcat(create_table,"create table qq_");
    110. strcat(create_table,"stu1");
    111. strcat(create_table,"_");
    112. strcat(create_table,port1);
    113. strcat(create_table,"(q_name text,q_information text);");
    114. //printf("%s\n",create_table);
    115. if(!sqlite3_exec(studb,create_table,NULL,NULL,&errstr))//创建一个表来存储信息
    116. {
    117. //printf("create table is suceessfuly \n");
    118. }
    119. else
    120. {
    121. //printf("create_table is failed \n");
    122. /// printf("error: %s\n",errstr);
    123. }
    124. sqlite3_close(studb);
    125. }
    126. void read_table_stu1(char *a,char* b)//a :ip b: port  //从表里面读取数据
    127. {
    128. sqlite3 *studb =NULL;
    129. //下面这个函数 返回0 是执行成功
    130. int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数   sqlite3 里面的 agrv[1] (参数传入)
    131. if(!res)
    132. {
    133. //printf("sqlite3_Open ok\n");//打开成功
    134. }
    135. else
    136. {
    137. printf("sqlite_open error\n");//打开失败
    138. printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
    139. return ;
    140. }
    141. char * errstr =NULL;
    142. //char *look = "select * from qq_ip_port";//查看所有的列
    143. char look[1024]="";
    144. char ** paz_result;
    145. int hang;//用于存放获取到的总个数
    146. int lie;//用于存放一列表的个数
    147. strcat(look,"select * from qq_");
    148. strcat(look,"stu1");
    149. strcat(look,"_");
    150. strcat(look,b);
    151. //printf("%s\n",look);
    152. //将数据库内容传到C变量里
    153. if(SQLITE_OK != sqlite3_get_table(studb,look,&paz_result,&hang,&lie,&errstr))
    154. {
    155. //打印错误信息
    156. fprintf(stderr,"数据库操作错误\n%s\n",errstr); //输入到标准报错里面
    157. //释放掉错误区域内存,防止内存溢出
    158. sqlite3_free(errstr);
    159. return;
    160. }
    161. int i,j,index = 0;
    162. for ( i = 0; i <= hang; i++)//默认会少打印一行,所以 i <= hang
    163. {
    164. for ( j = 0; j < lie; j++)
    165. {
    166. printf("%s\t",paz_result[index]);
    167. index++;
    168. }
    169. printf("\n");
    170. }
    171. sqlite3_close(studb);
    172. }
    173. int main(int argc,char *argv[])
    174. {
    175. char ip[1024]="192.168.1.162";
    176. char port[1024]="10000";
    177. char name[1024]="hh";
    178. char kk[1024]="sdasdasdasdas";
    179. create_table_stu1(ip,port);//a: ip b:prot
    180. sqlite3_input(ip ,port,name,kk);//a :ip b: prot c: name d: 信息
    181. read_table_stu1(ip,port);//a: ip b: prot
    182. return 0;
    183. }

  • 相关阅读:
    简单神经网络算法原理,人工神经网络算法原理
    永磁同步电机36问(三)——SVPWM代码实现
    10. 获取操作系统版本和位数
    云栖大会72小时沉浸式精彩回顾
    Jmeter对图片验证码的处理
    机器学习案例(二):服务员小费预测
    ahx文件转mav文件 工具分享及说明
    Java 定时任务技术发展历程
    ETL为什么经常变成ELT甚至LET?
    【JavaSE专栏53】Java集合类HashMap详解
  • 原文地址:https://blog.csdn.net/she666666/article/details/126385493