1、SQLite嵌入式数据库的配置、编译与安装;
2、设计两个数据表,一个为 students表,包含学号、姓名、班级共3个字段;一个表为score表,包含学号、实验1、实验2、实验3、平时成绩和测试成绩共6个字段。
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;
}
在使用树莓派安装libsqlite3-dev时,出现如下错误:
libsqlite3-dev : 依赖: libsqlite3-0 (= 3.16.2-5+deb9u1) 但是 3.27.2-3 正要被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
处理办法
强制卸载软件依赖包,指令如下:
sudo dpkg --purge --force-depends libsqlite3-0
安装新的依赖包
sudo apt-get install libsqlite3-0
强制安装
sudo apt-get install -f
重新安装libsqlite3-dev
sudo apt-get install -f
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