• 数据库—SQLite3


    一、数据库的概念

      数据库是数据库管理系统管理与控制之下,存放在存储介质上的数据集合。

    二、常用的数据库

      大型数据库

      Oracle关系数据库、sun公司的DB2数据库

      中型数据库

      Server数据库,微软

      小型数据库

      MySQL,sun公司

    三、基于嵌入式的数据库

      基于嵌入式的数据库主要有:SQLite 、Firebird、Brekeley DB、 eXtremeDB

      SQLite关系型数据库,体积小,支持ACID事务

      Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等

      Berkeley中无数据库服务器概念,它的程序直接连接到应用程序中

      eXTREmeDB是内存数据库,运行效率高

    四、SQLite基础

            

    五、创建数据库

      安装:sudo apt-get install sqlite3

    六、数据库常用命令

      1、系统命令

      以‘ . ’开头的命令

      .help 帮助  .quit 退出  .exit 退出  .databases 查看打开的数据库

      .table 查看当前数据库下的表格

      2、SQL命令

      以分号结尾

      1、创建一张数据库表 stu 

      create table stu(id integer , name char , score integer);

      2、查看所有表的创建语句

      .schema

      3、完全插入数据

      insert into stu values(1001, 'zhuguo', 10);

         部分插入数据

      insert into stu (name, score)values('yitong', 100);

      4、查询记录

      select name from stu;  //查部分字段

      select * from stu;   //查所有字段

      select * from stu where score=100 and name='yitong'; //按条件与查询

      select * from stu where score = 100 or score = 10; //按条件或查询

       5、删除记录

      delete from stu;  //删除整个记录表

      delete from stu where id = 1001;  //按条件删除记录

      6、更新表

      update stu set name='wangba' where score=50;

      update stu set name='yitong' , score = 20 where id=1001;

      7、增加字段

      alter table stu add column address char;  //增加列 address

      8、删除一列

      sqlite3不支持直接删除一列

         1)---创建一张新的表

              create table stu1 as select id, name, sex from stu;

         2 )---删除原有的表

              drop  table stu;

          3)---将新的表名改为原有的旧表名

               alter table stu1 rename to stu;

     

    七、SQLite编程接口

    int sqlite3_open(char *path, sqlite3 **db);
    //功能:打开sqlite3数据库
    //path:数据库文件路径
    //db    :返回sqlite句柄的指针
    //返回值:成功--0-SQLITE_OK, 失败--错误码
    
    int sqlite3_close(sqlite3 *db);
    //关闭数据库,成功0,失败错误码
    
    const char *sqlite3_errmg(sqlite3 *db);
    //返回值:返回错误信息的首地址

    功能:执行一条SQL语句

    int sqlite3_exec(
      sqlite3*,                                  /* 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 */
    );
    参数:
    db  数据库操作句柄
    sql  一条sql语句
    callback 回调函数,只要sql为查询语句时才会执行
    void * 给回调函数传参
    errmsg 错误信息
    返回值: 成功 SQLITE_OK

    int (*callback)(void*,int,char**,char**);
    功能:查询的结果,是一个函数指针类型,填函数名即可

    回调函数

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

    不使用回调函数执行SQL语句

    //功能:执行SQL语句
    int sqlite3_get_table( sqlite3
    * db, / *打开的数据库* / const char * zSql, / *SQL语句 * / char *** pazResult, / *指向执行结果的指针* / int * pnRow, / *结果行数:满足条件的记录数* / int * pnColumn, / *结果列数:每条记录的字段数* / char ** pzErrmsg / *错误信息指针的地址* / ); void sqlite3_free_table(char ** result); //功能:

    As an example of the result table format, suppose a query result is as follows:

    
    
    Name        | Age
    -----------------------
    Alice       | 43
    Bob         | 28
    Cindy       | 21
    有两列(M == 2)和三行(N == 3)。因此,结果表具有8个条目。假设结果表存储在名为azResult的数组中。然后azResult保留以下内容:
    azResult[0] = "Name"; //二级指针数组存放每个内容的首地址
    azResult[1] = "Age";
    azResult[2] = "Alice";
    azResult[3] = "43";
    azResult[4] = "Bob";
    azResult[5] = "28";
    azResult[6] = "Cindy";
    azResult[7] = "21";

    示例代码:

      1 #include <stdio.h>
      2 #include <sqlite3.h>
      3 #include <stdlib.h>
      4 
      5 #define DATABASE "stu.db"
      6 
      7 /*插入 */
      8 int do_insert(sqlite3 *db)
      9 {
     10     int id;
     11     char name[32]={};
     12     int score;
     13     char sql[128]={};
     14     char *errmsg;
     15 
     16     printf("Intput id:");
     17     scanf("%d",&id);
     18     getchar();  //回收垃圾字符
     19 
     20     printf("Intput name:");
     21     scanf("%s",name);
     22     getchar();  
     23 
     24     printf("Intput score:");
     25     scanf("%d",&score);
     26     getchar();  
     27 
     28     /*使用sprintf进行字符拼接*/
     29     sprintf(sql,"insert into stu values(%d, '%s', %d);",id, name, score);
     30     if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK)
     31     {
     32         printf("%s
    ", errmsg);
     33     }
     34     else
     35     {
     36         printf("Insert done.
    ");
     37     }
     38 
     39     return 0;
     40 
     41 }
     42 
     43 /*删除 */
     44 int do_delete(sqlite3 *db)
     45 {
     46     int id;
     47     char sql[128]={};
     48     char *errmsg;
     49 
     50     printf("Intput id:");
     51     scanf("%d",&id);
     52     getchar();  //回收垃圾字符
     53 
     54     /*使用sprintf进行字符拼接*/
     55     sprintf(sql,"delete from stu where id=%d",id);
     56     if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK)
     57     {
     58         printf("%s
    ", errmsg);
     59     }
     60     else
     61     {
     62         printf("Delete done.
    ");
     63     }
     64 
     65     return 0;
     66 
     67 }
     68 
     69 /*更新 */
     70 int do_update(sqlite3 *db)
     71 {
     72     int id;
     73     int score;
     74     char sql[128]={};
     75     char *errmsg;
     76 
     77     printf("Intput id:");
     78     scanf("%d",&id);
     79     getchar();  //回收垃圾字符
     80 
     81     printf("Intput score:");
     82     scanf("%d",&score);
     83 
     84     /*使用sprintf进行字符拼接*/
     85     sprintf(sql,"update stu set score=%d,where id = %d",score,id);
     86     if(sqlite3_exec(db,sql, NULL, NULL, &errmsg) != SQLITE_OK)
     87     {
     88         printf("%s
    ", errmsg);
     89     }
     90     else
     91     {
     92         printf("Update  done.
    ");
     93     }
     94 
     95     return 0;
     96 
     97 }
     98 
     99 //定义回调函数,每找到一条记录自动执行一次回调函数
    100 int callback(void *para, int f_num, char **f_value, char **f_name)
    101 {
    102     int i = 0;
    103 
    104     for(i=0; i<f_num; i++)
    105     {
    106         printf("%-11s", f_value[i]);
    107     }
    108     putchar(10);
    109 
    110     return 0;
    111 }
    112 /*查询 */
    113 int do_query(sqlite3 *db)
    114 {
    115     char sql[128]={};
    116     char * errmsg;
    117     sprintf(sql,"select * from stu;");
    118 
    119     if(sqlite3_exec(db,sql, callback, NULL, &errmsg) != SQLITE_OK)
    120     {
    121         printf("%s
    ", errmsg);
    122     }
    123     else
    124     {
    125         printf("Query done.
    ");
    126     }
    127 
    128     return 0;
    129 }
    130 
    131 /*不使用回调函数执行SQL语句---查询 */
    132 int do_query_1(sqlite3 *db)
    133 {
    134     char sql[128]={};
    135     char * errmsg;
    136     char **resultp;
    137     int nrow;
    138     int ncolumn;
    139     int index;
    140 
    141     int i,j;
    142 
    143     sprintf(sql,"select * from stu;");
    144 
    145     if(sqlite3_get_table(db,sql, &resultp,&nrow,&ncolumn, &errmsg) != SQLITE_OK)
    146     {
    147         printf("%s
    ", errmsg);
    148     }
    149     else
    150     {
    151         printf("Query done.
    ");
    152     }
    153 
    154     for(j=0; j<ncolumn; j++)
    155     {
    156         printf("%-11s",resultp[j]);
    157     }
    158     putchar(10);
    159 
    160     index = ncolumn;
    161     for(i=0; i<nrow; i++)
    162     {
    163         for(j=0; j<ncolumn; j++)
    164         {
    165             printf("%-11s",resultp[index++]); //第一行的列都不打印
    166         }
    167         putchar(10);
    168     }
    169     return 0;
    170 }
    171 
    172 
    173 int main(int argc, const char *argv[])
    174 {
    175     sqlite3 *db;
    176     char *errmsg; //定义一级指针存放错误号的地址
    177     int cmd;
    178 
    179     if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
    180     {
    181         printf("%s
    ",sqlite3_errmsg(db));
    182         return -1;
    183     }
    184     else
    185     {
    186         printf("open DATABASE success.
    ");
    187     }
    188 
    189     //创建一张数据库的表格
    190     if(sqlite3_exec(db,"create table stu (id integer, name char, score integer);", NULL, NULL, &errmsg) != SQLITE_OK)
    191     {
    192         printf("%s
    ", errmsg);
    193     }
    194     else
    195     {
    196         printf("create table or open success.
    ");
    197     }
    198 
    199     while(1)
    200     {
    201         printf("************************************
    ");
    202         printf("1:insert 2:delete 3:query 4:update 5:quit.
    ");
    203         printf("************************************
    ");
    204 
    205         printf("Intput CMD:");
    206         scanf("%d",&cmd);
    207         getchar();
    208 
    209         switch(cmd)
    210         {
    211             case 1:
    212                 do_insert(db);
    213                 break;
    214             case 2:
    215                 do_delete(db);
    216                 break;
    217             case 3:
    218                 do_query_1(db);
    219                 break;
    220             case 4:
    221                 do_update(db);
    222                 break;
    223             case 5:
    224                 sqlite3_close(db);
    225                 exit(1);
    226             default:
    227                 printf("ERROR CMD!!
    ");
    228         }
    229     }
    230 
    231 
    232     return 0;
    233 }
    student.c
  • 相关阅读:
    多读者多写者的无锁队列
    PCI设备的地址空间
    交换机能不能连接不同的网段?
    VMware Workstation的三种网络连接模式
    Linux内存寻址和内存管理
    Fragment基础信息传递
    Android Studio获取SHA1和MD5方法
    AppCan学习笔记数据存储及listview简单应用
    Fragment基础生命周期
    Fragment基础创建
  • 原文地址:https://www.cnblogs.com/y4247464/p/12241588.html
Copyright © 2020-2023  润新知