第六天 + 第七天
进程与线程
fork()
返回值为0就是子进程,不为0就是父进程
在 Linux 上安装 SQLite
目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite。
$ sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
如果没有看到上面的结果,那么就意味着没有在 Linux 机器上安装 SQLite。因此,让我们按照下面的步骤安装 SQLite:
-
步骤如下:
$ tar xvzf sqlite-autoconf-3071502.tar.gz
$ cd sqlite-autoconf-3071502
$ ./configure --prefix=/usr/local
$ make
$ make install
上述步骤将在 Linux 机器上安装 SQLite,您可以按照上述讲解的进行验证。
sqlite3
sqlite命令
1、exit 退出
sqlite
数据库
2、 .table 查询表
3、 create table 表名(索引1,索引2,.........); 创建表
4、insert into 表名 values("数据1","数据2",........); 增
5、delete from 表名; 删
delete from 表名 where 索引名="数据"; 删除指定元素
where 后面的条件可以用and 或者or连接
6、update 表名 set 索引名="数据"; 改
7、select 索引名 from 表名; 查
索引名处写* 表示查找表中·所有元素
作业:创建一个表,在表中设置两个索引id,password;注册两个账号。xxx(123) yyy(abc),修改xxx的密码为csswdhde999 ,注销yyy的账号
//创建表accounts(账户)
creat table accounts (
id integer primary key, //设置id
password next
);
creat index id_index on accounts (id);
creat index password_index on accounts (password);
//创建账号并插入
inset into accounts (id, password) values (1, '123');
inset into accounts (id, password) values (2, 'abc');
//修改账号密码
update accounts set password = 'csswdhde999' where id = 1;
//注销账号
delete from accounts where id = 2;
2、sqlite3 接口函数
gcc sqlite3.c - l sqlite3
编译时需要链接到sqlite3库
int sqlite3_open(const char *pathname,sqlite3 **db);i nt sqlite3_close(sqlite3*);int sqlite3_exec(sqlite3 * db,const char *sql,sqlite_callback,void char**);
db :打开的.db文件的句柄
sql :需要执行的sqlite3命令语句
callback :回调函数,当执行的语句有输出时,才需要用
arg :传入callback的参数
errmsg :存放错误信息
int sqlite3_open(const char*, sqlite3**);
函数用于打开/创建一个函数库
const char* 指定文件名,
sqlite3** 指定数据库句柄,用户通过数据库句柄操作数据库
返回一个整数错误代码,=0 表示成功码,> 0都是错误
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
函数用于执行一条或多条SQL语句,SQL语句之间用“;”隔开
sqlite3*指定已打开的数据库句柄,const char *sql 指定SQL指令,sqlite_callback 在回调函数中可以获得SQL执行的结果,void* 指定传给回调函数的数据 , char** 指定命令执行失败的详细错误信息
返回0表示sql指令执行完毕,否则说明这次执行没有成功
int callback(void *arg,int a,char **b,char **c)
arg:exec函数的第四个参数
/* 由 sqlite3_exec() 的第四个参数传递而来 */
a:索引数
/* 表的列数 */
b:查询到的结果
/* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
c:索引名
/* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
返回值:1 中断查找,0 继续列举查询到的数据
int sqlite3_close(sqlite3*);
关闭数据库文件,参数是数据库句柄
课堂代码:
#include <stdio.h>
#include <sqlite3.h>
int main()
{
sqlite3 *db;
if(SULITE_OK != sqlite3_open ("stu.db",&db))
{
printf("open error!\n");
return -1;
}
printf("open sqlite3 success.........\n");
char* errmsg =NULL;
char name[20] = {0};
char age[20] = {0};
char sex[20] = {0};
scanf("%s%*c%s%*c%s",name,age,sex);
char sql{200} ={0};
sprintf(sql,"insert into tb1 values(\"%s\",\"%s\",\"%S\");",name,age,sex);
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
sqlite3_close(db);
return 0;
}
课堂作业:创建一个具有注册登录检验功能的程序(使用sqlite3)
hqyj@ubuntu:~/Desktop/a$ cat -n b.c
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sqlite3.h>
4 #include<string.h>
5
6 //回调函数,用于从查询结果中获取数据
7 static int callback(void* data,int argc,char** argv,char** az)
8 {
9 int i;
10 for(i=0;i<argc;i++)
11 {
12 printf("%s = %s\n",az[i],argv[i]?argv[i] : "NULL");
13 }
14 printf("\n");
15 return 0;
16 }
17
18 int main(int argc,char* argv[])
19 {
20 sqlite3* db;
21 char* errmsg = 0;
22 int rc;
23 //打开数据库
24 rc = sqlite3_open("user.db",&db);
25 if(rc)
26 {
27 fprintf(stderr,"无法打开数据库:%s\n",sqlite3_errmsg(db));
28 sqlite3_close(db);
29 return(1);
30 }
31
32 /* //创建用户表
33 rc = sqlite3_exec(db,"CREATE TABLE user (ID INT PRIMARY KEY NOT NULL, USERNAME TEXT NOT NULL, PASSWORD TEXT NOT NULL);",callback,0,&errmsg);
34 if(rc != SQLITE_OK)
35 {
36 fprintf(stderr,"表创建出错:%s\n",errmsg);
37 sqlite3_free(errmsg);
38 }
39 else
40 {
41 fprintf(stdout,"表创建成功\n");
42 }
43 //插入用户数据
44 rc = sqlite3_exec(db,"INSERT INTO user (ID , USERNAME, PASSWORD)VALUES(1,'user1','password1');",callback,0,&errmsg);
45 if(rc != SQLITE_OK)
46 {
47 fprintf(stderr,"插入数据,SQL出错:%s\n",errmsg);
48 sqlite3_free(errmsg);
49 }
50 else
51 {
52 fprintf(stdout,"记录创建成功\n");
53 }
54 */
55 //查询用户数据
56 rc = sqlite3_exec(db,"SELECT *FROM user;",callback,0,&errmsg);
57 if(rc != SQLITE_OK)
58 {
59 fprintf(stderr,"查询失败,SQL出错:%s\n",errmsg);
60 sqlite3_free(errmsg);
61 }
62
63 //登录验证
64 char username[20];
65 char password[20];
66 strcpy(username,"user1");
67 strcpy(password,"password1");
68 sqlite3_stmt* stmt;
69 rc = sqlite3_prepare_v2(db,"SELECT * FROM user WHERE USERNAME =? AND PASSWORD =?;",20,&stmt,NULL);
70 if(rc != SQLITE_OK)
71 {
72 fprintf(stderr,"登录失败:%s\n",sqlite3_errmsg(db));
73 return 1;
74 }
75 sqlite3_bind_text(stmt,1,username,-1,SQLITE_STATIC);
76 sqlite3_bind_text(stmt,2,password,-1,SQLITE_STATIC);
77 rc =sqlite3_step(stmt);
78 if(rc == SQLITE_ROW)
79 {
80 printf("加载成功.....\n");
81 }
82 else {
83 printf("加载失败......\n");
84 }
85 sqlite3_finalize(stmt);
86 sqlite3_close(db);
87 return 0;
88 }
89
代码运行结果:
hqyj@ubuntu:~/Desktop/a$ ./bo表创建成功记录创建成功 //插入数据记录ID = 1USERNAME = user1PASSWORD = password1加载成功........
注意:这个代码仅用一次,第二次可将表格创建以及数据插入部分注释(如上)编译