前言
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;
}
}
}