网络编程学习——5
一、数据库概述
功能:
增删改查
轻量级符合嵌入式:
mysql
sqlite(常用)
1.基本数据库指令
.open //打开数据库
.table //查看有哪些表
.schema //查看表结构
.quit //退出
2.基本sql语句
(1)create table创建表
create table users(
name char
psw char
);
(2)insert into 插入
insert into users values("admin","123456");
(3)select 查询
select * from users;
(4)update 修改
update users set name = "myname" where name = "test";
(5)delete 删除
delete from users where name = "myname";
二、数据库操作
1.sqlite3_open 打开数据库函数
函数功能:打开数据库
函数原型:
#include <sqlite3.h> int sqlite3_open( const char *filename, // 数据库文件路径 sqlite3 **ppDb // 输出参数:指向数据库句柄的指针 );
函数参数:
1.
filename
:
- 数据库文件的路径(字符串)。
- 若文件不存在,SQLite 会自动创建该文件。
- 特殊值
":memory:"
表示创建内存数据库(数据仅存于内存,程序退出后丢失)。- 空字符串
""
表示创建临时磁盘数据库(会话结束后删除)。2.
ppDb
:
- 输出参数,用于接收打开的数据库句柄(
sqlite3*
类型的指针)。- 若函数调用失败,该值可能为
NULL
或无效句柄,需通过返回值判断。返回值:
成功 :返回
SQLITE_OK
(值为 0),此时ppDb
指向有效的数据库句柄。失败 :返回非 0 错误码(如
SQLITE_CANTOPEN
表示无法打开文件
2.sqlite3_errmsg 错误处理函数
函数功能:输出错误信息
函数原型:
#include <sqlite3.h> const char *sqlite3_errmsg(sqlite3 *db);
函数参数:
参数
db
:数据库句柄(sqlite3*
类型),由sqlite3_open
返回。返回值:
- 指向错误信息字符串的指针(以 null 结尾的 C 字符串)。
- 若当前无错误,返回
"not an error"
。
3.sqlite3 标准返回值(宏)
宏名 | 说明 |
---|---|
SQLITE_OK | 成功 |
SQLITE_ERROR | 失败 |
4.sqlite3_exec 操作数据库函数
函数功能:实现对数据库增删改查
函数原型:
#include <sqlite3.h> int sqlite3_exec( sqlite3 *db, // 数据库句柄(由 sqlite3_open 获得) const char *sql, // 要执行的 SQL 语句(以 null 结尾的字符串) int (*callback)(void*, int, char**, char**), // 回调函数(处理查询结果,可选) void *arg, // 传递给回调函数的用户数据(可选) char **errmsg // 输出参数:存储错误信息(可选) );
返回值:
- 成功:返回
SQLITE_OK
(值为 0)。- 失败:返回非 0 错误码(如
SQLITE_ERROR
表示 SQL 语法错误),可通过errmsg
或sqlite3_errmsg(db)
获取详细信息。回调函数:
tips
如果回调函数的返回值 不为0 ,exec会报错处理,所以当处理完查询到的数据后要return 0
int (*callback)( void *arg, // 由 sqlite3_exec 传递的用户自定义数据 int argc, // 当前行的列数 char **argv, // 存储当前行各列的值(字符串形式,NULL 表示字段值为 NULL) char **colname // 存储当前行各列的名称(字符串形式) );
5.sqlite3_close关闭数据库
int sqlite3_close(sqlite3 *db);
三、数据库程序示例
根据表内学生成绩,运行程序给学生成绩打等级
60~70—— D
70~80—— C
80~90—— B
90~100—— A
60以下—— X
1.表结构
CREATE TABLE students(
name char, //学生姓名
age int, //年龄
score int, //分数
grade char); //等级
2.程序源代码
/*===============================================
* 文件名称:db.c
* 创 建 者:青木莲华
* 创建日期:2025年08月20日
* 描 述:数据库使用示例
================================================*/
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
//回调函数:显示学生信息
int print_msg(void *arg,int cols,char **colval,char **colname)
{
int i,score;
for(i = 0 ; i < cols ; i++)
{
printf("%s : %12.10s ||",colname[i],colval[i]);
}
printf("\n");
return 0;
}
//回调函数:处理学生信息
int insert_grade(void *arg,int cols,char **colval,char **colname)
{
sqlite3 *db = (sqlite3 *)arg;
int score = atoi(colval[2]);
char grade = 0;
char update[128] = {0};
char *err_msg;
//评级
if(score < 60)
grade = 'X';
else if(score < 70)
grade = 'D';
else if(score < 80)
grade = 'C';
else if(score < 90)
grade = 'B';
else if(score <= 100)
grade = 'A';
sprintf(update,"update students set grade = '%c' where name = '%s';",grade,colval[0]);
printf("%s\n",update);
//将数据写入数据库
if(SQLITE_OK != sqlite3_exec(db,update,NULL,NULL,&err_msg))
{
printf("exec_insert : %s\n",err_msg);
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
//数据库指针
sqlite3 *db;
//1.打开数据库
if(SQLITE_OK != sqlite3_open("./test.db",&db))
{
printf("open : %s\n",sqlite3_errmsg(db));
return -1;
}
char *err_msg;
//2.查询
if(SQLITE_OK != sqlite3_exec(
db,"select * from students",print_msg,NULL,&err_msg))
{
printf("exec : %s\n",err_msg);
return -1;
}
//3.评级
if(SQLITE_OK != sqlite3_exec(
db,"select * from students",insert_grade,(void *)db,&err_msg))
{
printf("exec : %s\n",err_msg);
return -1;
}
//4.查询
if(SQLITE_OK != sqlite3_exec(
db,"select * from students",print_msg,NULL,&err_msg))
{
printf("exec : %s\n",err_msg);
return -1;
}
//3.对学生成绩自动评级
sqlite3_close(db);
return 0;
}