数据库—SQLite3

一、数据库的概念

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

二、常用的数据库

  大型数据库

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

  中型数据库

  Server数据库,微软

  小型数据库

  MySQL,sun公司

三、基于嵌入式的数据库

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

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

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

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

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

四、SQLite基础

        数据库—SQLite3

五、创建数据库

  安装: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