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 <table_name>(不填最后这个是 显示所有的表)
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 - 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值
该语句创建一个记录学生信息的数据表。
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 <table_name>;
10.查询表中所有记录
sqlite>select * from <table_name>;
例子:
11.按指定条件查询表中记录
sqlite>select * from <table_name> where <expression>
;
例子:
12.向表中添加新记录
sqlite> insert into <table_name> values (value1, value2,…);
例子:
13.按指定条件删除表中记录
sqlite>delete from <table_name> where <expression>
例子:
14.在表中添加字段(添加表里面的元素)
sqlite>
alter table <table> add column <field> <type> 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代码: 实现上面的函数:(看代码:才能看懂)
程序功能: 基本的写入信息;
/************************************************************************************************************************************************************************************************************************
*文件名:
*作 者:She001
*时 间:
*版 本:
*作 用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<syslog.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/time.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/msg.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sqlite3.h>
#include<sys/select.h>
#include<sys/poll.h>
int main(int argc,char *argv[])
{
sqlite3 *studb =NULL;
//下面这个函数 返回0 是执行成功
int res =sqlite3_open(argv[1],&studb);// 打开数据库的函数 sqlite3 里面的 agrv[1] (参数传入)
if(!res)
{
printf("sqlite3_Open ok\n");//打开成功
}
else
{
printf("sqlite_open error\n");//打开失败
printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
return -1;
}
//首先我们要在终端处创建一个 sqlite3
//的数据库 (比如说 我创建了一个stu 的库 在里面 创建了学生的登陆信息记录表)
//终端 : sqlite3 stu.db
//sqlite3> create table stu_xinxi(s_name text,s_ip text ,s_time text, s_caozuo text); //建立一个表
//sqlite3>.schema //查看是否创建成功
//sqlite3>.save //保存 (报错不要管 ,但是实际上他帮你保存了)
//sqlite3>.backup //备份(报错不要管)
//sqlite3>.quit //退出sqit
//
//
//
//
//再次进入stu.db 看看是否保存
//终端: sqlite3 stu.db
//sqlite3>.schema //查看表是否存在
//有的话就成功了.
char * errstr =NULL;
//先写好操作sqlite3的库的命令
const char * stup ="insert into stu_xinxi(s_name,s_ip,s_time,s_caozuo)values(\'帅哥\',\'192.168.1.162 \',\'13:12:12\',\'下线\');";
//下面这个函数返回0 是执行成功
if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
{
printf("opeation is suceessfuly \n");
}
else
{
printf("opeation is failed \n");
printf("error: %s\n",errstr);
}
printf("dasdasdasd\n");
sqlite3_close(studb);
return 0;
}
22.读取数据库
功能:写入一个数据,之后读取库里面的所有数据
代码:
/************************************************************************************************************************************************************************************************************************
*文件名:
*作 者:She001
*时 间:
*版 本:
*作 用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<syslog.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/time.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/msg.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sqlite3.h>
#include<sys/select.h>
#include<sys/poll.h>
int main(int argc,char *argv[])
{
sqlite3 *studb =NULL;
//下面这个函数 返回0 是执行成功
int res =sqlite3_open(argv[1],&studb);// 打开数据库的函数 sqlite3 里面的 agrv[1] (参数传入)
if(!res)
{
printf("sqlite3_Open ok\n");//打开成功
}
else
{
printf("sqlite_open error\n");//打开失败
printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
return -1;
}
//首先我们要在终端处创建一个 sqlite3
//的数据库 (比如说 我创建了一个stu 的库 在里面 创建了学生的登陆信息记录表)
//终端 : sqlite3 stu.db
//sqlite3> create table stu_xinxi(s_name text,s_ip text ,s_time text, s_caozuo text); //建立一个表
//sqlite3>.schema //查看是否创建成功
//sqlite3>.save //保存 (报错不要管 ,但是实际上他帮你保存了)
//sqlite3>.backup //备份(报错不要管)
//sqlite3>.quit //退出sqit
//
//
//
//
//再次进入stu.db 看看是否保存
//终端: sqlite3 stu.db
//sqlite3>.schema //查看表是否存在
//有的话就成功了.
char * errstr =NULL;
//先写好操作sqlite3的库的命令
const char * stup ="insert into stu_xinxi(s_name,s_ip,s_time,s_caozuo)values(\'帅哥\',\'192.168.1.162 \',\'13:12:12\',\'下线\');";
//下面这个函数返回0 是执行成功
if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
{
printf("opeation is suceessfuly \n");
}
else
{
printf("opeation is failed \n");
printf("error: %s\n",errstr);
}
/读取库的信息
char * look = "select * from stu_xinxi";//查看所有的列
char ** paz_result;
int hang;//用于存放获取到的总个数
int lie;//用于存放一列表的个数
//将数据库内容传到C变量里
if (SQLITE_OK != sqlite3_get_table(studb,look,&paz_result,&hang,&lie,&errstr))
{
//打印错误信息
fprintf(stderr,"数据库操作错误\n%s\n",errstr); //输入到标准报错里面
//释放掉错误区域内存,防止内存溢出
sqlite3_free(errstr);
return -3;
}
printf("一共有%d行,每行参数%d个(列)\n",hang,lie);
printf("\n\n详细信息\n");
int i,j,index = 0;
for ( i = 0; i <= hang; i++)//默认会少打印一行,所以 i <= hang
{
for ( j = 0; j < lie; j++)
{
printf("%s\t",paz_result[index]);
index ++;
}
printf("\n");
}
sqlite3_close(studb);
return 0;
}
23.封装之后的程序
代码:
/************************************************************************************************************************************************************************************************************************
*文件名:
*作 者:She001
*时 间:
*版 本:
*作 用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<syslog.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/time.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/msg.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sqlite3.h>
#include<sys/select.h>
#include<sys/poll.h>
void sqlite3_input(char *a,char *b,char *c,char *d )//把用户接受的 写入数据库 a ip b port c : name d : 信息
{
sqlite3 *studb =NULL;
//下面这个函数 返回0 是执行成功
int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数 sqlite3 里面的 agrv[1] (参数传入)
if(!res)
{
//printf("sqlite3_Open ok\n");//打开成功
}
else
{
printf("sqlite_open error\n");//打开失败
printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
return ;
}
char * errstr =NULL;
//先写好操作sqlite3的库的命令
//const char * stup ="insert into qq_ip_port(q_name, q_information )values(\'帅哥\',\'下线\');";
char stup[1024]="";
strcat(stup,"insert into qq_");
strcat(stup,"stu1");
strcat(stup,"_");
strcat(stup,b);
strcat(stup,"(q_name,q_information)values(\'");
strcat(stup,c);
strcat(stup,"\',\'");
strcat(stup,d);
strcat(stup,"\');");
//printf("%s\n",stup);
//下面这个函数返回0 是执行成功
if(!sqlite3_exec(studb,stup,NULL,NULL,&errstr)) //执行命令stup errstr 是出现错误的时候返回的错误信息
{
//printf("opeation is suceessfuly \n");
}
else
{
printf("opeation is failed \n");
printf("error: %s\n",errstr);
}
sqlite3_close(studb);
}
void create_table_stu1(char* a,char *b)//a: ip b:port //创造一个表
{
sqlite3 *studb =NULL;
//下面这个函数 返回0 是执行成功
int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数 sqlite3 里面的 agrv[1] (参数传入)
if(!res)
{
// printf("sqlite3_Open ok\n");//打开成功
}
else
{
//printf("sqlite_open error\n");//打开失败
// printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
return ;
}
char * errstr =NULL;
//char * create_table ="create table qq_ip_port(q_name text , q_information text);";
char create_table[1024]="";
char ip1[1024]="";
char port1[1024]="";
strcat(ip1,a);//ip
strcat(port1,b);//port
strcat(create_table,"create table qq_");
strcat(create_table,"stu1");
strcat(create_table,"_");
strcat(create_table,port1);
strcat(create_table,"(q_name text,q_information text);");
//printf("%s\n",create_table);
if(!sqlite3_exec(studb,create_table,NULL,NULL,&errstr))//创建一个表来存储信息
{
//printf("create table is suceessfuly \n");
}
else
{
//printf("create_table is failed \n");
/// printf("error: %s\n",errstr);
}
sqlite3_close(studb);
}
void read_table_stu1(char *a,char* b)//a :ip b: port //从表里面读取数据
{
sqlite3 *studb =NULL;
//下面这个函数 返回0 是执行成功
int res =sqlite3_open("stu1.db",&studb);// 打开数据库的函数 sqlite3 里面的 agrv[1] (参数传入)
if(!res)
{
//printf("sqlite3_Open ok\n");//打开成功
}
else
{
printf("sqlite_open error\n");//打开失败
printf("errmsg:%s \n",sqlite3_errmsg(studb));//错误信息的返回 函数errmsg
return ;
}
char * errstr =NULL;
//char *look = "select * from qq_ip_port";//查看所有的列
char look[1024]="";
char ** paz_result;
int hang;//用于存放获取到的总个数
int lie;//用于存放一列表的个数
strcat(look,"select * from qq_");
strcat(look,"stu1");
strcat(look,"_");
strcat(look,b);
//printf("%s\n",look);
//将数据库内容传到C变量里
if(SQLITE_OK != sqlite3_get_table(studb,look,&paz_result,&hang,&lie,&errstr))
{
//打印错误信息
fprintf(stderr,"数据库操作错误\n%s\n",errstr); //输入到标准报错里面
//释放掉错误区域内存,防止内存溢出
sqlite3_free(errstr);
return;
}
int i,j,index = 0;
for ( i = 0; i <= hang; i++)//默认会少打印一行,所以 i <= hang
{
for ( j = 0; j < lie; j++)
{
printf("%s\t",paz_result[index]);
index++;
}
printf("\n");
}
sqlite3_close(studb);
}
int main(int argc,char *argv[])
{
char ip[1024]="192.168.1.162";
char port[1024]="10000";
char name[1024]="hh";
char kk[1024]="sdasdasdasdas";
create_table_stu1(ip,port);//a: ip b:prot
sqlite3_input(ip ,port,name,kk);//a :ip b: prot c: name d: 信息
read_table_stu1(ip,port);//a: ip b: prot
return 0;
}