SQLite3的简单使用

前言

SQLite是一款轻型的数据库,它包含在一个相对小的C库中,设计目标是用于嵌入式开发,同时能够跟很多程序语言相结合,也能够支持Windows/Linux/Unix等等主流的操作系统。SQLite主要使用sql语句对数据库进行操作,SQL语句是一种结构查询语句,是一种通用的数据库操作语言(能够在世面上所有的主流的数据库软件使用)。
本文主要展示了在Linux环境中SQLite3结合c语言的使用,下面例子程序使用的是SQLite3的3.43.2版本,在ubuntu22.04版本下编译运行的一个简单的学生信息管理系统(文章末尾有主程序完整代码)


使用数据库的步骤

1.创建数据库并打开数据库文件

	sqlite3 *sql;   //创建数据库的句柄
    char *errmsg;   //用于保存sql语句的报错信息

    //打开数据库文件,有则打开,没有则创建
    if (sqlite3_open("./mydata.db", &sql) != SQLITE_OK)
    {
        printf("open filed\n");
        return-1;
    }

2.创建table表,并设置表中的字段名和数据类型

这里利用了

int sqlite3_exec(
	sqlite3* database,                              //数据库的句柄
	const char *,									//要执行的sql语句
	int (*callback)(void*,int,char**,char**),       /*函数指针,当你执行查询命令的时候必须用到
												这个参数,如果是执行其他命令,该参数不必传递,
												在本文中执行查询命令使用了其他函数实现查询功能*/
    void * ,										//传递给第三个参数里函数指针的参数
    char **errmsg									//保存执行sql语句的错误信息
//创建stutable表
    if (sqlite3_exec(sql, "create table if not exists stutable(name text unique , age int , score double);", 
                                                                        NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("create failed:%s\n", errmsg);
        return -1;
    }

程序运行界面
数据库程序查询数据库状态

3.添加信息功能

	 printf("请输入学生姓名:");
	 scanf("%s", name);
	 printf("请输入学生年龄:");
	 scanf("%d", &age);
	 printf("请输入学生成绩:");
	 scanf("%lf", &score);
	// insert into 表的名字 values (数据1,数据2.......);
	//拼接sql语句
	sprintf( buf ,"insert into stutable values (\"%s\" , %d , %lf);", name, age, score); 
	if(sqlite3_exec(sql, buf, NULL, NULL, &errmsg)!= SQLITE_OK)
	     printf("insert failed:%s\n", errmsg);

主程序添加学生信息
查看所有信息
数据库中查看数据库中的信息
添加三个学生信息后在数据库程序查看信息

4.删除信息功能

			printf("请输入你要删除的学生的名字:");
            scanf("%s", name);

            // delete  from 表的名字  where 条件;
            sprintf(buf ,"delete from stutable where name= \'%s\';", name);

            if (sqlite3_exec(sql, buf, NULL, NULL, &errmsg) != SQLITE_OK)
                printf("delete failed:%s\n", errmsg);

主程序执行删除功能
查看删除后结果

5.修改信息功能

       printf("请输入你要修改的学生的名字:");
       scanf("%s", name);
            
       printf("请输入你要修改的年龄和成绩:\n");
       scanf("%d %lf", &age, &score);

       //update 表的名字 set  字段名=新的值  where  条件;
       sprintf( buf ,"update stutable  set age=%d,score=%lf  where name=\'%s\';", age, score , name);

        if (sqlite3_exec(sql, buf, NULL, NULL, &errmsg) != SQLITE_OK)
        	printf("select failed:%s\n", errmsg);

主程序执行修改信息功能
查看修改后的结果

6.查询信息功能

int sqlite3_get_table(
	sqlite3 *db,		//数据库的句柄
	const char *zSql,	//要执行的SQL语句
	char ***pazResult,	//保存结果的指针
	int *pnRow,			//保存行的数目的指针
	int *pnColumn,		//保存列的数目的指针
	char **pzErrmsg		//保存sql执行的错误信息
);
            int line , row;  //用于保存行和列的序号
            char **str;     //用于保存获取到的数据

            printf("请输入你要查询的学生的名字:");
            scanf("%s", name);

            //select  * from 表的名字  where  条件;
            sprintf(buf ,"select * from stutable where name= \'%s\';", name); //单引号需要使用转义符

            if (sqlite3_get_table(sql, buf,&str, &line , &row , &errmsg) != SQLITE_OK)
            {
                printf("select failed:%s\n", errmsg);
                break;
            }

            int now = row;    //列数
            printf("------------------------------------------------\n");
            //打印字段名
            for (int n = 0; n < row; n++)
            {
                printf("%s\t",str[n]);
            }
            printf("\n");

            //打印数据
            for (int i = 0; i < line; i++)   //遍历每一行
            {
                for (int m = 0; m < row; m++)   //遍历每一列
                {
                    printf("%s\t",str[now++]);   //获取每一行每一列对应的数据
                } 
                
            }
            printf("\n");
            printf("------------------------------------------------\n");
            sleep(3);

主程序执行查询功能

7.查看所有信息

            if (sqlite3_get_table(sql, "select * from stutable",&str, &line , &row , &errmsg) != SQLITE_OK)
            {
                printf("select failed:%s\n", errmsg);
            }

            now = row;
            printf("------------------------------------------------\n");
            //打印字段名
            for (int n = 0; n < row; n++)
            {
                printf("%s\t",str[n]);
            }
            printf("\n");
			//打印数据
            for (int i = 0; i < line; i++)     //遍历每一行
            {
                for (int m = 0; m < row; m++)   //遍历每一列
                {
                    printf("%s\t ",str[now++]);  
                } 
                printf("\n");
            }
            printf("------------------------------------------------\n");
            sleep(3);

完整代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"  //与sqlite3有关的头文件

int main()
{
    sqlite3 *sql;   //创建数据库的句柄
    char *errmsg;   //用于保存sql语句的报错信息

    //打开数据库文件,有则打开,没有则创建
    if (sqlite3_open("./mydata.db", &sql) != SQLITE_OK)
    {
        printf("open filed\n");
        return-1;
    }

    //创建stutable表
    if (sqlite3_exec(sql, "create table if not exists stutable(name text unique , age int , score double);", 
                                                                        NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("create failed:%s\n", errmsg);
        return -1;
    }

    int chose;  //保存选择的功能的序号
    char name[10];
    int age;
    double score;
    char buf[100];  //用于保存sql语句

    while (1)
    {
        bzero(buf ,sizeof(buf));
        bzero(name ,sizeof(name));
        system("clear");
        printf("----------------------------------------------\n");
        printf("\t\t学生信息管理系统\t\t\n");
        printf("\t\t1.添加学生信息\t\t\n");
        printf("\t\t2.查询学生信息\t\t\n");
        printf("\t\t3.修改学生信息\t\t\n");
        printf("\t\t4.删除学生信息\t\t\n");
        printf("\t\t5.查看所有信息\t\t\n");
        printf("\t\t6.退出程序\t\t\n");
        printf("------------------------------------------------\n");
        printf("请选择你要执行的功能:\n");

        scanf("%d", &chose);
        switch (chose)
        {
        case 1:   //添加功能
            
            printf("请输入学生姓名:");
            scanf("%s", name);
            printf("请输入学生年龄:");
            scanf("%d", &age);
            printf("请输入学生成绩:");
            scanf("%lf", &score);

            // insert into 表的名字 values (数据1,数据2.......);
            //拼接sql语句
            sprintf( buf ,"insert into stutable values (\"%s\" , %d , %lf);", name, age, score); 

            if(sqlite3_exec(sql, buf, NULL, NULL, &errmsg)!= SQLITE_OK)
            printf("insert failed:%s\n", errmsg);

            break;

        case 2:  //查询功能
            int line , row;  //用于保存行和列的序号
            char **str;     //用于保存获取到的数据

            printf("请输入你要查询的学生的名字:");
            scanf("%s", name);

            //select  * from 表的名字  where  条件;
            sprintf(buf ,"select * from stutable where name= \'%s\';", name); //单引号需要使用转义符

            if (sqlite3_get_table(sql, buf,&str, &line , &row , &errmsg) != SQLITE_OK)
            {
                printf("select failed:%s\n", errmsg);
                break;
            }

            int now = row;    //列数
            printf("------------------------------------------------\n");
            //打印字段名
            for (int n = 0; n < row; n++)
            {
                printf("%s\t",str[n]);
            }
            printf("\n");

            //打印数据
            for (int i = 0; i < line; i++)   //遍历每一行
            {
                for (int m = 0; m < row; m++)   //遍历每一列
                {
                    printf("%s\t",str[now++]);   //获取每一行每一列对应的数据
                } 
                
            }
            printf("\n");
            printf("------------------------------------------------\n");
            sleep(3);

            break;

        case 3:        //修改功能
            printf("请输入你要修改的学生的名字:");
            scanf("%s", name);
            
            printf("请输入你要修改的年龄和成绩:\n");
            scanf("%d %lf", &age, &score);

            //update 表的名字 set  字段名=新的值  where  条件;
            sprintf( buf ,"update stutable  set age=%d,score=%lf  where name=\'%s\';", age, score , name);

            if (sqlite3_exec(sql, buf, NULL, NULL, &errmsg) != SQLITE_OK)
                printf("select failed:%s\n", errmsg);

            break;
        case 4:    //删除功能
            printf("请输入你要删除的学生的名字:");
            scanf("%s", name);

            // delete  from 表的名字  where 条件;
            sprintf(buf ,"delete from stutable where name= \'%s\';", name);

            if (sqlite3_exec(sql, buf, NULL, NULL, &errmsg) != SQLITE_OK)
                printf("delete failed:%s\n", errmsg);


            break;
        case 5:   //显示全部
            //select  *  from  表的名字; 
            if (sqlite3_get_table(sql, "select * from stutable",&str, &line , &row , &errmsg) != SQLITE_OK)
            {
                printf("select failed:%s\n", errmsg);
            }

            now = row;
            printf("------------------------------------------------\n");
            for (int n = 0; n < row; n++)
            {
                printf("%s\t",str[n]);
            }
            printf("\n");

            for (int i = 0; i < line; i++)
            {
                for (int m = 0; m < row; m++)
                {
                    printf("%s\t ",str[now++]);  
                } 
                printf("\n");
            }
            printf("------------------------------------------------\n");
            sleep(3);
            break;
        case 6 :   //退出功能
            sqlite3_close(sql);
            return 0;
        default:
            printf("请输入正确的数字\n");
            sleep(1);
            break;
        }
    }

}

PS:该主程序需要与sqlite3.c一起编译,并需要包含sqlite3.h,这两个文件可以在移植sqlite3到ubuntu中后的源码中找到

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值