SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试

1、SQLite嵌入式数据库的配置、编译与安装;
2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试成绩共6个字段。
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第1张图片
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第2张图片
3、设计一个学生管理系统,编写一个 SQLite应用程序stu_man.c,启动并打开 test. db程序后,显示功能菜单提示用户操作:①输入学生信息;②输入学生成绩;③打印学生成绩;④退出程序。
Score.c代码:

#include 
#include 
#include 
#include 

#include 

sqlite3 *db = NULL; // 一个打开的数据库实例

//获取进程自身路径
size_t get_executable_path(char* processdir, char* processname, size_t len)
{
	char* path_end;
	if (readlink("/proc/self/exe", processdir, len) <= 0)
	{
		return -1;
	}
	path_end = strrchr(processdir, '/');
	if (path_end == NULL)
	{
		return -1;
	}
	++path_end;
	strcpy(processname, path_end);
	*path_end = '\0';
	return (size_t)(path_end - processdir);
}
void newStudent()
{
	char name[1024] = { 0 };
	char studentId[1024] = { 0 };
	int classId = 0;
	sqlite3_stmt *stmt;
	const char* sql;

	printf("请输入名字:");
	scanf("%s", &name);

	printf("请输入学号:");
	scanf("%s", &studentId);

	printf("请输入班级:");
	scanf("%d", &classId);

	sqlite3_exec(db, "begin;", 0, 0, 0);

	sql = "insert into students values(NULL,?,?,?)";
	sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, 0);
	sqlite3_reset(stmt);
	sqlite3_bind_text(stmt,1, name,-1,SQLITE_TRANSIENT); //绑定数据
	sqlite3_bind_text(stmt,2, studentId,-1, SQLITE_TRANSIENT); //绑定数据
	//SQLITE_TRANSIENT告诉SQLite复制你的字符串.当您的字符串(缓冲区)在执行查询之前将会消失时使用此选项.
	//SQLITE_STATIC告诉SQLite,您承诺,传递给该字符串的指针将有效,直到执行查询为止.当您的缓冲区为um,static或至少具有超过绑定的动态范围时,请使用此方法.

	sqlite3_bind_int(stmt, 3, classId);
	sqlite3_step(stmt);

	sqlite3_finalize(stmt);
	sqlite3_exec(db, "commit;", 0, 0, 0);

}
void newScore()
{
	char studentId[1024] = { 0 };
	int test1 = 0;
	int test2 = 0;
	int test3 = 0;
	int performance = 0;
	int scores = 0;
	sqlite3_stmt *stmt;
	const char* sql;
	printf("请输入学生学号:");
	scanf("%s", &studentId);

	printf("请输入学生实验1成绩:");
	scanf("%d", &test1);

	printf("请输入学生实验2成绩:");
	scanf("%d", &test2);

	printf("请输入学生实验3成绩:");
	scanf("%d", &test3);

	printf("请输入学生平时成绩:");
	scanf("%d", &performance);

	printf("请输入学生测试成绩:");
	scanf("%d", &scores);

	sqlite3_exec(db, "begin;", 0, 0, 0);
	
	sql = "insert into score values(NULL,?,?,?,?,?,?)";
	sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, 0);

	sqlite3_reset(stmt);
	sqlite3_bind_text(stmt, 1, studentId, -1, SQLITE_TRANSIENT); //绑定数据
	//SQLITE_TRANSIENT告诉SQLite复制你的字符串.当您的字符串(缓冲区)在执行查询之前将会消失时使用此选项.
	//SQLITE_STATIC告诉SQLite,您承诺,传递给该字符串的指针将有效,直到执行查询为止.当您的缓冲区为um,static或至少具有超过绑定的动态范围时,请使用此方法.

	sqlite3_bind_int(stmt, 2, test1);
	sqlite3_bind_int(stmt, 3, test2);
	sqlite3_bind_int(stmt, 4, test3);
	sqlite3_bind_int(stmt, 5, performance);
	sqlite3_bind_int(stmt, 6, scores);
	sqlite3_step(stmt);

	sqlite3_finalize(stmt);
	sqlite3_exec(db, "commit;", 0, 0, 0);

}
void printfScore()
{
	const char *sqlSentence = "SELECT * from score;";
	sqlite3_stmt *stmt = NULL;

	int result = sqlite3_prepare_v2(db, sqlSentence, -1, &stmt, NULL);

	if (result == SQLITE_OK) {
		while (sqlite3_step(stmt) == SQLITE_ROW) {
	
			printf("学号:%s\n实验1:%d\n实验2:%d\n实验3:%d\n平时成绩:%d\n测试成绩:%d\n\n",
				sqlite3_column_text(stmt, 1),
				sqlite3_column_int(stmt, 2),
				sqlite3_column_int(stmt, 3),
				sqlite3_column_int(stmt, 4),
				sqlite3_column_int(stmt, 5),
				sqlite3_column_int(stmt, 6));
		}
	}
	else
	{
		printf("SQL you wen ti!!!!!!!\n");
	}
	sqlite3_finalize(stmt);
	pause();
}

int main(int argc, char* argv[])
{

	//获取自身运行路径
	char path[1024];
	char processname[1024];
	get_executable_path(path, processname, sizeof(path));
	strcat(path, "test.db");




	int result = sqlite3_open_v2(path, &db,
		SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_PRIVATECACHE,
		NULL);

	if (result != SQLITE_OK)
	{
		printf("打开数据库连接失败\n");
		
	}
	printf("打开数据库连接成功\n");

	printf("1输入学生信息;2输入学生成绩;3打印学生成绩;4退出程序\n请选择(1~4):");
	int cmd;
	scanf("%d", &cmd);

	switch (cmd)
	{
	case 1:
		newStudent();
		break;
		
	case 2:
		newScore();
		break;
		
	case 3:
		printfScore();
		break;

	default:
		printf("输入错误,请重新选择!");
		break;

	}
	sqlite3_close_v2(db);
	return 0;
}

SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第3张图片
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第4张图片
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第5张图片

故障现象

在使用树莓派安装libsqlite3-dev时,出现如下错误:
libsqlite3-dev : 依赖: libsqlite3-0 (= 3.16.2-5+deb9u1) 但是 3.27.2-3 正要被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第6张图片
处理办法
强制卸载软件依赖包,指令如下:
sudo dpkg --purge --force-depends libsqlite3-0
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第7张图片
安装新的依赖包
sudo apt-get install libsqlite3-0
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第8张图片
强制安装
sudo apt-get install -f
在这里插入图片描述
重新安装libsqlite3-dev
sudo apt-get install -f
SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试_第9张图片

在虚拟机中搭建SQLITE环境,并测试其是否安装成

1.下载压缩包后解压sqlite-3.6.3tar.gz到/home目录下

tar -zxvf sqlite-3.6.3tar.gz -C /home
cd /home/
mkdir sqlite-ix86-linux/
cd /home/sqlite-ix86-linux/
/sqlite-3.6.3/configure --prefix=/home/sqlite-ix86-linux/

其中–prefix=/home/sqlite-ix86-linux/的意思是将configure是用来进行用户个性配置的工具, 一般- -开头的说明的是需要配置的选项,–prefix就是说软件额安装目录设置在哪里,后面的=/usr就是你给出的安装目录,当然你完全可以换一个目录。
2.编译并安装,然后生成帮助文档

Make && make install && make doc

3.此时库文件已经生成在/home/sqlite-ix86-linux/lib目录下
可执行文件sqlite3已经生成在/home/sqlite-ix86-linux/bin目录下
4.测试编译安装是否成功
在命令行直接输入:/home/sqlite-ix86-linux/bin/sqlite3 test.db

你可能感兴趣的:(SQLite嵌入式数据库的配置、编译与安装; 2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试)