提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
一、安装
sqlite3.数据库的安装
方法1:1–本地安装
sudo dpkgi *.deb
方法2:–在线安装
sudo apt get install sqlite3
二、SQLITE3 基本命令(使用shell命令行操作SQLite数据库)
系统命令
以’.'开头的命令
.help:帮助
.quit:退出
.exit:退出
.schema:查看表的结构图
.databases:查看打开的数据库
.table:查看当前数据库下的表格
sql命令
基本的sq1命令,不以‘.’开头,但是都要以’;'结尾
创建一张数据库表
create table stu(id Integer , name char , score Integer);
插入一条记录
insert into stu values(1001,’zhangsan', 80);//全部字段的插入
insert into stu(id,name)values(1001,‘zhangsan’);//部分字段的插入
查询记录
select * from stu;//查询所有字段
select name,sorce from stu;//查询所需的字段
select * from stu where name='lisi and id=1001;';//查找特定字段字段
select * from stu where name='lisi or id=1001;';//查找特定字段字段
删除字段
delete from stu where name='lisi';//直接删除的方式
update stu set name='lili' where id=1001;//通过更新的方式
//把id为1001的人的名字改为lili。
//where前后都可以多个条件量。
修改表格字段
alter table stu add column address char;/给stu这个表格加入一列addre
sqlite3不支持删除一列
//1-- 创建一张新的表
create table stu1 as select id, name, score from stu;
//2-- 删除原有的表
drop table stu;
//3--将新的表名字改成原有的旧表的名字
alter table stu1 rename to stu;
二、SQLITE3 函数接口(使用c程序调用SQLITE3)
打开和关闭一个数据库
int sqlite3_open(const char *filename, sqlite3 **ppDb);
int sqlite3_close(sqlite3* db);
·filename:要打开的数据库文件名
·ppDb:指向sqlite3指针的指针,用于存储向打开的数据库连接的地址
sqlite3_open()函数用于打开一个SQLite数据库,返回一个sqlite3的指针,用于后续操作数据库。
返回值:成功 SQLITE_OK 失败 返回错误值
sqlite3_close()函数用于关闭一个已打开的数据库。
返回值:成功 SQLITE_OK 失败 返回错误值
打印错误值
const char *sqlite3_errmsg(sqlite3* db);
功能:sqlite3_errmsg通过数据库的句柄打印错误值。
返回值:错误信息的首地址。
执行sql语句
int sqlite3_exec(sqlite3* db,
const char *sql,
int (*callback)(void* para, int f_num, char**f_value, char**f_name),
//void*para传入的参数,
//int f_num记录了字段的数量,
//char**f_value记录了字段值的指针数组,
// char**f_name记录了字段名称的指针数组
void* data,
char **errmsg);
功能:执行一条sql语句。
参数:
db:一个已经打开的数据库连接
sql:要执行的SQL语句
callback:回调函数,用于处理查询结果集,只有执行查询语句的时候,才会执行此语句。
data:传递给回调函数的用户数据指针
errmsg:用于存储错误信息的指针
返回值:成功 SQLITE_OK
不调用回调函数的查询函数
int sqlite3_get_table(
sqlite3 *db, /* 数据库连接对象 */
const char *zSql, /* 查询语句 */
char ***pazResult, /* 存储查询结果的二维字符数组 */
int *pnRow, /* 返回查询结果的行数 */
int *pnColumn, /* 返回查询结果的列数 */
char **pzErrmsg /* 查询错误信息,可选参数 */
);
1.db:表示一个已经打开的数据库连接对象。
2.zSql:表示待执行的 SQL 查询语句。
3.pazResult:是一个指向指针的指针,用于存储查询结果。查询结果以二维字符数组的形式返回,每个单元格都是一个字符串。这个参数的值由函数分配和设置。
4.pnRow:传入一个 int 类型的指针变量的地址,用于接收查询结果的行数。
5.pnColumn:传入一个 int 类型的指针变量的地址,用于接收查询结果的列数。
6.pzErrmsg:一个可选参数,用于接收查询错误信息的字符串。如果查询失败,该参数将被设置为错误信息。如果不关心错误信息,可以设置为 NULL。
函数返回值:
7.如果查询执行成功,返回值为 SQLITE_OK(宏定义的值为0)。
8.如果查询执行出错,返回值为一个非零的错误码,可通过错误码对应的宏定义进行错误类型的判断。
写一个使用数据库的示例代码,完成对数据的增删改查
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define DATABASE "stu.db"
int do_insert(sqlite3 * db)
{
int id;
char name[32]={};
int score;
char sql[128]={};
char * errmsg;
printf("input id\n");
scanf("%d",&id);
getchar();
printf("input name\n");
scanf("%s",name);
getchar();
printf("input score\n");
scanf("%d",&score);
getchar();
sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score );
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("insert done.\n");
}
};
int do_delete(sqlite3 * db)
{
int id;
char sql[128]={};
char * errmsg;
printf("input id\n");
scanf("%d",&id);
getchar();
sprintf(sql,"delete from stu where id=%d;",id);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("delete done.\n");
}
};
int do_update(sqlite3 * db)
{
int id;
int score;
char sql[128]={};
char * errmsg;
printf("input id\n");
scanf("%d",&id);
getchar();
printf("input new score\n");
scanf("%d",&score);
getchar();
sprintf(sql,"update stu set score = %d where id = %d;",score,id);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("update done.\n");
}
};
//使用回调函数查询
int callback(void* para, int f_num, char**f_value, char**f_name)
{
int i = 0;
for (i=0;i<f_num;i++)
{
printf("%-11s",f_value[i]);
}
putchar(10);
return 0;
}
int do_query(sqlite3 * db)
{
char sql[128]={};
char * errmsg;
sprintf(sql,"select * from stu;");
if(sqlite3_exec(db,sql,callback,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("query done.\n");
}
};
//不使用回调函数的一种查询方法
int do_query1(sqlite3 * db)
{
char sql[128]={};
char * errmsg;
char ** result;
int pnRow;
int pnColumn;
int i=0;
int j=0;
sprintf(sql,"select * from stu;");
if(sqlite3_get_table(db,sql,&result,&pnRow,&pnColumn,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("update done.\n");
}
int index =0;
for(i=0;i<pnColumn+1;i++)
{
for(j=0;j<pnRow;j++)
{
printf("%-11s",result[index++]);
}
putchar(10);
}
};
int main(int argc , const char* argv[])
{
//创建一个数据库句柄
sqlite3 * db;
//创建一个错误信息一级指针
char* errmsg;
//定义一个命令选项
int cmdnum;
//打开数据库
if(sqlite3_open(DATABASE,&db)!=SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
else
{
printf("Open DATABASE Success...\n");
}
//创建一个数据库的表格
if(sqlite3_exec(db,"create table stu(id Integer,name char,score Interger);",NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("creat table success.\n");
}
//对表格实现增删改查
while(1)
{
printf("**************************\n");
printf("1.insert 2.delete 3.query 4.update 5.quit\n");
printf("**************************\n");
printf("cmd:%d\n",cmdnum);
scanf("%d",&cmdnum);
getchar();
switch (cmdnum)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query1(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0) ;
default:
printf("err cmd");
}
}
return 0;
}