Linux:SQLite基本使用及C语言示例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux:SQLite基本使用及C语言示例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7064字,纯文字阅读大概需要11分钟。
内容图文
![Linux:SQLite基本使用及C语言示例](/upload/InfoBanner/zyjiaocheng/862/a1388e58cf30421c8a1bc0393cd74a9f.jpg)
1、简介
? sqlite3在2000年诞生,体积小(约250KB,3万行代码),是其他大型数据库的阉割版,集成了绝大多数的功能,但不是严格的数据类型匹配、不支持数据类型检测。轻量级的数据库,支持数据库大小至2TB,比目前流行的大多数数据库对数据操作要快。
2、安装(大部分Linux发行版本已经默认自带)
sudo apt-get install sqlite3
3、终端上的操作命令
3.1 进入sqlite3
sqlite3
3.2 系统命令(以“.”开头)
命令 | 功能 |
---|---|
.help | 帮助 |
.quit | 退出 |
.exit | 退出 |
.schema | 查看表的结构图 |
.database | 查看路径 |
.table | 查看数据库表 |
3.3 SQL基本命令(不以“.”开头,而是以“;”结尾)
创建数据库
sqlite3 student.db
创建一张数据库表stu,变量在前类型在后(char也可表示字符串)
create table stu(id Integer, name char, score Integer);
插入一组数据(char类型使用单引号和双引号都可以)
insert into stu values(1001, 'zhangsan', 80); // 所有值
insert into stu values(1002, "zhangsan2", 90);
insert into stu (id, name)values(1003, 'lisi'); // 插入部分值
查看
select * from stu; // 查看所有
select name from stu; // 查看指定部分
select id, name from stu;
select * from stu where score=80;
select * from stu where score=80 and id=1001;
select * from stu where score=80 or score=90;
删除
delete from stu; // 删除所有
delete from stu where name='zhangsan'; // 删除指定
delete from stu where name='zhangsan' and id=1001;
delete from stu where name='zhangsan' or id=1001;
更新(修改)
update stu set name='wangwu' where id=1001; // 将id为1001改名为wangwu
update stu set name="wangwu", score=85 where id=1001;
添加列
alter table stu add column address char; // 添加列(这里是address)
删除列(sqlite不支持删除列,可以制作新的表再删除旧的)
以删除address列为例:
create table stu1 as select id, name, score from stu; // 拷贝成新的数据库
drop table stu; // 删除旧的数据库
alter table stu1 rename to stu; // 将新的数据库改名
4、C语言API接口
参考:https://sqlite.org/c3ref/funclist.html
① 打开数据库
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
参数:filename 数据库路径名;
? ppDb 数据库操作句柄(传出)。
返回:成功返回SQLITE_OK;
? 失败设置错误码,可用sqlite3_errmsg函数获取描述
② 关闭数据库
int sqlite3_close(sqlite3 *db);
参数:db 操作数据库的指针句柄;
返回:成功返回SQLITE_OK;失败则设置错误码
③ 查看错误信息
const char *sqlite3_errmsg(sqlite3 *db);
参数:db 操作数据库的指针句柄;
返回:描述错误信息的首地址
④ 执行一条sql语句
int sqlite3_exec(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void *arg,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数:db 操作数据库的指针句柄;
? sql 一条语句;
? callback 回调函数,只有sqi为查询语句的时候才会调用该回调函数;
? arg 给callback提供arg参数;
? errmsg 错误信息
返回:成功返回SQLITE_OK
⑤ sqlite3_exec回调函数的形式
int (*callback)(void *para, int f_num, char **f_value, char **f_name);
功能:每找到一条记录自动执行一次回调函数
参数:para 传递给回调函数的参数;
? f_num 记录中包含的字段数目,也就是“列”数;
? f_value 每个字段值的指针数组;
? f_name 每个字段名称的指针数组
返回:成功返回0,失败返回-1
⑥ 查询数据库
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
参数:db 操作数据库的指针句柄;
? zSql SQL语句;
? pazResult 用来指向sql执行结果的指针;
? pnRow 满足条件的记录的数目,也就是“行”数;
? pnColumn 每条记录包含的字段数目,也就是“列”数;
? pzErrmsg 错误信息指向的地址
返回:成功返回0,失败返回错误码
5、C语言使用示例
注意:编译时需要加上“-lsqlite3”链接参数。
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "stu.db"
int do_insert(sqlite3 *db)
{
int id;
char name[12] = {};
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Input name:");
scanf("%s", name);
getchar();
printf("Input score:");
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");
}
return 0;
}
int do_delete(sqlite3 *db)
{
int id;
char sql[128] = {};
char *errmsg;
printf("Input id:");
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");
}
return 0;
}
int do_update(sqlite3 *db)
{
int id;
int score;
char sql[128] = {};
char *errmsg;
printf("Input update id:");
scanf("%d", &id);
getchar();
printf("Update score:");
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");
}
return 0;
}
#if 0 /* 方法1:sqlite3_exec加回调函数方式 */
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]);
}
printf("\n");
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");
}
return 0;
}
#else /* 方法2:sqlite3_get_table函数方式 */
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int ncloumn;
int i, j;
int index;
sprintf(sql, "select * from stu;");
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK){
printf("%s\n", errmsg);
} else {
printf("Query done.\n");
}
/* 打印抬头 */
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[j]);
}
printf("\n");
index = ncloumn;
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[index++]);
}
printf("\n");
}
return 0;
}
#endif
int main(int argc, char **argv)
{
sqlite3 *db;
char *errmsg;
int cmd;
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 Integer);", NULL, NULL, &errmsg) != SQLITE_OK){
printf("%s\n", errmsg);
} else {
printf("create table success.\n");
}
while(1)
{
printf("*********************************************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit\n");
printf("*********************************************\n");
printf("please input your cmd:");
scanf("%d", &cmd);
getchar();
switch(cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("Error Cmd\n");
break;
}
}
return 0;
}
参考:
【嵌入式】SQlite3数据库开发–华清远见成都中心.哔哩哔哩
内容总结
以上是互联网集市为您收集整理的Linux:SQLite基本使用及C语言示例全部内容,希望文章能够帮你解决Linux:SQLite基本使用及C语言示例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。