• sqlite3数据库


    嵌入式数据库sqlite3

    1.数据库基本概念
    数据
    能够输入计算机并能被计算机程序识别和处理的信息集合
    数据库
    数据库是在数据库管理系统和控制之下,存放在存储介质上的数据集合。
    2.常用的数据库
    1.大型数据库
    Oracle公司是最早开发关系数据库的厂商之一,其技术支持最广泛的操作系统平台。目前Oracle关系数
    据库产品的市场占有率名列前茅。
    IBM 的 DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包linux在内的一系列平台。
    2.中型数据库
    Server是微软开发的数据库产品,主要支持windows平台。
    3.小型数据库
    mySQL是一个小型关系数据库管理系统,开发爱着为瑞典MySQL AB公司,2008年被Sun公司收购,开
    放源码。
    3.基于嵌入式的数据库
    基于嵌入式linux的数据库主要有SQlite,Firebird,Berkeley DB,eXtremeDB
    Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等
    SQlite关系型数据库体积小,支持ACID事务
    Berkeley DB中并没有数据库服务器的概念,它的程序直接链接到应用程序中
    eXtremeDB是内存数据库,运行效率高
    4.SQlite基础
    SQLite的源码是C语言,其源代码完全开发,SQLite第一个Alpha版本诞生于2000年5月,他是一个轻量级的
    嵌入式数据库。
    SQLite有以下特性
    零配置,无需安装和管理配置
    存储在单一磁盘文件中的一个完整的数据库
    数据库文件可以在不同字节顺序的机器间自由共享
    支持数据库大小至2TB
    足够小,全部源码大致三万行C代码,250KB
    比目前留下的大多数数据库对数据的操作更快
    5.创建数据库
    1.在线安装
    sudo apt-get install sqlite3
    2.本地安装
    官网下载sqlite3,然后本地安装:sudo dpkg -i *.deb
    3.SQlite3 基本命令
    1.系统命令
    以 . 开头的命令
    .help 帮助
    .quit 退出
    .schema查看表结构
    .databases 查看打开的数据库
    .table
    2.sql命令
    基本的sql命令,不以 . 开头,但是都要 ; 结尾
    创建一张数据库的表stu

    create table stu(id Integer,name char,score Integer);
    

    插入一张记录

    insert into stu values(1001,'zhangsan',80);
    

    插入部分字段记录

    insert into stu(name,score) values('lisi'1002);
    

    查询所有记录

    select *from stu
    

    查询数据库部分内容字段

    select name,score from stu
    

    根据属性查询

    select * from stu where score=80;
    select *from stu where score=80 and name='zhangsan';
    

    删除一条记录

    delete from stu where id=1003; delete from stu where socre='90';
    

    更新一条记录

    update stu set name='wangwu' where id=1001;
    update stu set name='wangwu',score=88 where id = 1001;
    

    添加一列

    alter table stu add column address char;
    

    删除一列
    1.创建一张表
    提取字段

    create table stu1 as select id,name,score from stu;
    

    2.删除原有表

    drop table stu;
    

    3.将新的表的名字改成原有的表名字

    alter table stu1 rename to stu;
    

    5.SQlite编程接口
    API操作

    1.int sqlite3_open(char *filename,sqlite3 **db)
    

    功能:打开sqlite数据库
    参数:
    filename:数据库文件路径
    db:指向sqlite句柄的指针
    返回值:
    成功返回0,失败返回错误码(非0值)

    2.int sqlite3_close(sqlite3 *db);
    

    功能:关闭sqlite数据库
    参数:
    db 操作数据库的指针
    返回值:
    成功返回0,失败返回错误码

    3.const char *sqlite3_errmsg(sqlite3 *db);
    

    功能:通过DB句柄得到数据库操作的错误信息
    参数:
    db 操作数据库的指针
    返回值:
    返回错误信息的首地址

    4.int sqlite3_exec(
    sqlite3*db,
    const char *sql,
    int (*callback)(void *,int,char**,char *8)
    void *,
    char **errmsg);
    

    功能:执行一条sql语句
    参数
    db:数据库操作句柄
    sql:一条sql语句
    callback:回调函数,只有sql为查询语句的时候,才会执行此语句
    void * :给回调函数传递参数
    errmsg:错误信息
    返回值:
    成功:SQLITE_OK

    int (*callback)(void *,int,char**,char *8)
    

    功能:查询结果,是一个函数指针类型,传递一个函数名
    回调函数接口:

    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语句

    int sqlite3_get_table(
    sqlite3 *db,
    const char *sql,
    char ***resultp,
    int *nrow,
    int *ncolumu,
    char **errmsg)
    

    功能:执行sql操作
    db:数据库句柄
    sql:sql语句
    resultp:用来指向sql执行结果的指针
    nrow:满足条件的记录的数目
    ncolumn:每条记录包含的字段数目
    errmsg:错误信息指针的地址
    返回值:成功返回0,失败返回错误码

    C语言使用sqlite3数据库,实现数据库的增删查改

    #include 
    #include 
    #include 
    
    #define DATABASE "student.db"
    
    /*插入一张记录*/
    int do_insert(sqlite3* db)
    {
    	int id;
    	char name[32] = {};
    	int score;
    
    	char sql[128] = {}; //用于存放sql指令
    
    	char* errmsg;
    
    	printf("please input id:");
    	scanf("%d",&id);
    	getchar();
    
    
    	printf("please input name:");
    	scanf("%s",name);
    	getchar();
    
    
    	printf("please input score:");
    	scanf("%d",&score);
    	getchar();
    
    	sprintf(sql,"insert into student values(%d,'%s',%d);",id,name,score);   //语句拼接存入sql中
    
    	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    	{
    		printf("%s\n",errmsg);
    		exit(0);
    	}
    	else
    	{
    		printf("insert success!\n");
    	}
    	return 0;
    }
    
    /*更新一条记录*/
    int do_update(sqlite3 *db)
    {
    	int id;
    	char name[128] = {};
    	int score;
    
    	char sql[128] = {};
    
    	char *errmsg;
    	printf("please input id:");
    	scanf("%d",&id);
    	getchar();
    
    	printf("please input score:");
    	scanf("%d",&score);
    	getchar();
    
    	sprintf(sql,"update student set score=%d where id=%d;",score,id);
    
    	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    	{
    		printf("%s\n",errmsg);
    		exit(0);
    	}
    	else
    	{
    		printf("updata success!\n");
    	}
    
    	return 0;
    }
    
    /*删除一条记录*/
    int do_delete(sqlite3 *db)
    {
    	int id;
    	char sql[128] = {};
    
    	char *errmsg;
    	printf("please input id:");
    	scanf("%d",&id);
    	getchar();
    
    	sprintf(sql,"delete from student where id=%d;",id);
    
    	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    	{
    		printf("%s\n",errmsg);
    		exit(0);
    	}
    	else
    	{
    		printf("delete success!\n");
    	}
    
    
    
    	return 0;
    }
    
    /*回调函数*/
    int callback(void *para,int f_num,char **f_value,char **f_name)
    {
    	int i = 0;
    	for(i = 0; i < f_num; i++)
    	{
    		printf("%s",f_value[i]);
    
    	}
    	putchar(10);
    	return 0;
    
    }
    
    /*查询所有记录,使用回调函数*/
    int do_query1(sqlite3 *db)
    {
    
    	char sql[128] = {};
    	char *errmsg;
    
    	sprintf(sql,"select *from student");
    	if(sqlite3_exec(db,sql,callback,NULL,&errmsg) != SQLITE_OK)
    	{
    		printf("%s\n",errmsg);
    		exit(0);
    	}
    	else
    	{
    		printf("querry success!\n");
    	}
    
    	return 0;
    }
    
    /*查询所有记录,不使用回调函数*/
    int do_query2(sqlite3 *db)
    {
    	char sql[128] = {};
    	char *errmsg;
    	char **resultp;
    	int nrow;
    	int ncloumn;
    	int i,j,index;
    
    	sprintf(sql,"select *from student;");
    
    	if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) != SQLITE_OK)
    	{
    	printf("%s\n",errmsg);
    	exit(0);
    	}
    	else
    	{
    		printf("query success!\n");
    	}
    	index = ncloumn;
    	for(j = 0; j < ncloumn; j++)
    	{
    		printf("%-11s",resultp[j]);
    	}
    	putchar(10);
    	for(i = 0;i < nrow;i++)
    	{
    		for(j = 0;j < ncloumn;j++)
    		{
    			printf("%-11s",resultp[index++]);
    
    		}
    		putchar(10);
    
    	}
    
    }
    
    
    int main()
    {
    	sqlite3* db;
    	char* errmsg;
    	int cmd;
    	if(sqlite3_open(DATABASE,&db) != SQLITE_OK)
    	{
    		printf("%s\n",sqlite3_errmsg(db));
    		exit(1);
    	}
    	else
    	{
    		printf("open sqlite3 success!\n");
    	}
    
    	if(sqlite3_exec(db,"create table student(id integer,name char,score integer);",NULL,NULL,&errmsg) != SQLITE_OK)
    	{
    		printf("%s\n",sqlite3_errmsg(db));
    		exit(1);
    	}
    	else
    	{
    		printf("create or open table success!\n");
    	}
    
    	while(1)
    	{
    		printf("***************************\n");
    		printf("1:insert, 2:delete, 3:quert, 4:update, 5:quit\n");
    		printf("***************************\n");
    		printf("please input cmd:");
                    scanf("%d",&cmd);
    
    		switch(cmd)
    		{
    			case 1:
    				do_insert(db);
    				break;
    			case 2:
    				do_delete(db);
    				break;
    			case 3:
    				do_query2(db);
    				break;
    			case 4:
    				do_update(db);
    				break;
    			case 5:
    				sqlite3_close(db);
    				exit(1);
    				break;
    			default:
    				printf("err cmd\n");
    
    		}
    
    	}
    
    	return 0;
    }
    
    

    在这里插入图片描述

  • 相关阅读:
    红日靶场五(vulnstack5)渗透分析
    Python字典-Dict使用
    算法leetcode|87. 扰乱字符串(rust重拳出击)
    OAK相机通过振动测试!
    基于jsp+mysql+ssm大学本科考研服务系统-计算机毕业设计
    数据指标体系
    UOS/Linux的root权限下启动一个带界面的程序
    DAY1-深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别
    运筹系列86:MIP问题的建模tips
    Java面试大厂名企高频真题--03虚拟机篇
  • 原文地址:https://blog.csdn.net/m0_61511416/article/details/127111441