网络编程学习——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 语法错误),可通过 errmsgsqlite3_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;
} 

3.运行截图

alt