华清远见25072班网络编程学习day6

重点内容:

数据库基本概念:

        数据(Data):能够输入计算机并能被计算机程序识别和处理的信息集合数据 (Database)

        数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

重要概念:

        记录:能够描述一条数据的完整信息称为一个记录(就是数据结构中的数据元素)

        字段:描述数据中的最小不可再分割的单元(就是数据结构中的数据项)

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

SQLite有以下特性:

        零配置 一 无需安装和管理配置;

        储存在单一磁盘文件中的一个完整的数据库;

        数据库文件可以在不同字节顺序的机器间自由共享;

        支持数据库大小至2TB;

        足够小,全部源码大致3万行c代码,250KB;

        比目前流行的大多数数据库对数据的操作要快;

sqlite3命令语句:

1. sqlite数据库创建

        1.sqlite3 xxx.db

        2.sqlite3-->.open xxx.db

2. 系统命令,也称为点命令        

        系统命令,需要以 . 开头,不需要以 ; 结尾

                .quit 退出数据库

                .exit 退出数据库

                .help 显示帮助信息,获取所有系统命令; ​

                .table 查看当前数据库下的所有表格;

                .schema 查看表的结构

3. sql语句

1)创建表格

        create table 表名 (字段名 数据类型, 字段名 数据类型);

        create table if not exists 表名 (字段名 数据类型, 字段名 数据类型); ​

2)删除表格

        drop table 表名;

3)插入记录

        insert into 表名 values (数据1, 数据2, 数据3);-->全字段插入

        insert into 表名 (字段名1, 字段名2) values (数据1, 数据2);-->部分字段插入

4)查看记录

        .header on 打开表头

        .mode column 对齐

        select * from 表名;-->查看所有记录

        select * from 表名 where 限制条件;-->查看某几行

        select 字段1, 字段2 from 表名;-->查看某几列

        select 字段1, 字段2 from 表名 where 限制条件;-->查看某几列

5)修改记录

        update 表名 set 字段=数值 where 限制条件; ​

6)删除记录

        delete from 表名 where 限制条件; ​

7)主键(primary key)

        create table 表名(字段名 数据类型 primary key, 字段名 数据类型 );

        primary key主键:唯一标识表格中的每一条记录;

8)拷贝

        从a中拷贝所有数据到b中: create table b as select * from a;

        从a中拷贝指定字段到b中: create table b as select 字段,字段,字段 from a; ​

9)增加列        

        alter table 表名 add column 字段名 数据类型;

10)修改表名

        alter table 旧表名 rename to 新表名;

11)修改字段名(列名)

        不支持直接修改列名

        1.将表重新命名(a改成b) alter table stuinfo rename to stu;

        2.新建修改名字后的表(新建一个a) create table stuinfo (name char, age1 int, sex char, score int);

        3.从旧表b中取出数据,插入到新表a中; insert into stuinfo select * from stu;

12)删除列

        不支持直接删除列;

        1.创建一个新表b,并复制旧表a需要保留的字段信息; create table stu as select name, age1, sex from stuinfo;

         2.删除旧表a; drop table stuinfo;

        3.修改新表b的名字a; alter table stu rename to stuinfo;

sqlite3 API:

1. sqlite3的C - APIs

1)sqlite3_open

        int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );

        功能:打开一个数据库,如果数据库不存在,则创建一个数据库并打开

        参数1:要打开的数据库的名字,是一个字符串

        参数2:数据库操作句柄,是一个二级指针,需要我们传入一级指针的地址,如果打开数据库成功,则数据库指针由该参数返回

        返回值:成功返回SQLITE_OK,失败返回一个错误码(非linux的错误码),可以使用sqlite3_errmsg来获取错误信息,由sqlite3_errcode返回错误码值

        注意:无论打开数据库是否成功,在不使用数据库时都应该使用sqlite3_close将其关闭

2)sqlite3_close

        int sqlite3_close(sqlite3*);

        功能:关闭数据库,断开句柄所拥有的资源

        参数:数据库指针

        返回值:成功返回SQLITE_OK,失败返回其他错误码

3)sqlite3_errmsg

        const char *sqlite3_errmsg(sqlite3*);

        功能:通过出错的句柄返回错误信息

        参数:出错的句柄

        返回值:对应的错误信息,是一个字符串

4)sqlite3_errcode

        int sqlite3_errcode(sqlite3 *db)

        功能:通过错误句柄返回错误码

        参数:错误句柄

        返回值:错误码

5)sqlite3_exec

        int sqlite3_exec( sqlite3* db, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *arg, /* 1st argument to callback */ char **errmsg /* Error msg written here */ );

        功能:调用该函数,执行sql语句

        参数1:已经被打开的数据库句柄

        参数2:要执行的sql语句

        参数3:回调函数,主要用于数据库查找时,处理查找的结果集的函数,如果不需要处理sql语句的结果,则填NULL即可

        参数4:参数3的第一个参数

        参数5:错误信息 返回值:成功返回SQLITE_OK,失败返回其他错误码

6)回调函数

        int callback(void* arg,int cols, char** msgtext, char** msgheader)

        功能:回调函数,对于sql语句执行后的每一个记录行执行该回调函数

        参数1:exec传递进来的参数

        参数2:当前要处理的结果行的总列数

        参数3:当前结果行信息的起始地址

        参数4:当前结果行表头的起始地址

        返回值:成功返回0,失败返回-1;

7)sqlite3_get_table

        onst char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ );
功能:通过执行sql语句,得到结果集中的内容

        参数1:数据库句柄

        参数2:要执行的sql语句

        参数3:查询结果的起始地址,需要定义一个二级指针变量,将地址进行传递

        参数4: 查询结果的行数(不包括表头)

        参数5:查询结果的列数

        参数6:错误信息

        返回值:成功返回SQLITE_OK,失败返回非0的错误码

8)sqltie3_free_table

        void sqlite3_free_table(char **result);

        功能:释放表的空间

        参数:通过sql语句查询的结果


作业:

1> 实现一个XXX管理系统

程序源码:

#include <25072head.h>
//定义添加学生信息函数
int do_add(sqlite3 *ppDb)
{
int add_id;          //要添加的id号
char add_name[20];   //要添加的姓名
double add_score;    //要添加的成绩

    printf("请输入要添加学生的学号:");
scanf("%d", &add_id);
printf("请输入要添加学生的姓名:");
scanf("%s", add_name);
printf("请输入要添加学生的成绩:");
scanf("%lf", &add_score);
getchar();
//准备sql语句
char sql[128] = "";
sprintf(sql ,"insert into stuinfo values(%d, \"%s\",%.2lf);", \
add_id,add_name,add_score);
//执行sql语句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("添加失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("添加成功\n");
}
return 0;
}
int do_delete(sqlite3 *ppDb)
{
int delete_id;                     //要删除的id号
printf("请输入要删除学生的学号");  
scanf("%d",&delete_id);
getchar();
//准备sql语句
char sql[128]="";
sprintf(sql,"delete from stuinfo where id=%d;",delete_id);
//执行sql语句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("删除失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("删除成功\n");
}
return 0;
}
int do_update(sqlite3 *ppDb)
{
int update_id;          //要修改的id号
char update_name[20];   //要修改的姓名
double update_score;    //要修改的成绩
printf("请输入要修改学生的学号:");
scanf("%d", &update_id);
printf("请输入修改后的学生姓名:");
scanf("%s", update_name);
printf("请输入修改后的学生成绩:");
scanf("%lf", &update_score);
getchar();
//准备sql语句
char sql[128]="";
sprintf(sql,"update stuinfo set name=\"%s\",score=%.2lf where id=%d;",update_name,update_score,update_id);
//执行sql语句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("修改失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("修改成功\n");
}
return 0;


}
//自定义查询函数的回调函数
int callback(void *arg, int cols, char **msgtext, char **msgheader)
{
if( *(int *)arg ==0)
{
//先输出表头
for(int i=0; i<cols; i++)
{
printf("%s\t", msgheader[i]);
}
printf("\n");
*(int *)arg = 1;
}
//输出内容
for(int i=0; i<cols; i++)
{
printf("%s\t", msgtext[i]);
}
printf("\n");
return 0;
}
//定义查找函数
int do_search(sqlite3 *ppDb)
{
//1.准备sql语句
char *sql = "select * from stuinfo;";
//2.执行sql语句
char *errmsg = NULL;
int flag = 0;
if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("查询失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
printf("查询成功\n");
return 0;
}
int main(int argc, const char *argv[])
{
//1,打开数据库并返回一个操作该数据库的句柄
sqlite3 * ppDb=NULL;
if(sqlite3_open("./my.db",&ppDb)!=SQLITE_OK)
{
printf("my.db open error errcode=%d,errmsg=%s\n",\
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
return -1;
}
//程序执行至此,后期可以使用ppDb指针,进行数据库操作了
//创建一个学生信息表
char *sql="create table if not exists stuinfo(id int primary key,\
name text not NULL,score double);";
//定义指针接收执行sql语句后的错误信息
char *errmsg=NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("创建数据表失败:%s\n",errmsg);
sqlite3_free(errmsg);
errmsg=NULL;
return -1;
}
printf("学生信息表创建成功!\n");
int menu = -1;
while(1)
{
system("clear");           //执行系统终端指令
printf("\t\t==============XXX学生管理系统=============\n");
printf("\t\t==============1、增=======================\n");
printf("\t\t==============2、删=======================\n");
printf("\t\t==============3、改=======================\n");
printf("\t\t==============4、查=======================\n");
printf("\t\t==============0、退出=======================\n");
printf("请输入功能:");
scanf("%d", &menu);
getchar();
//多分支选择
switch(menu)
{
case 1:
{
do_add(ppDb);
}
break;

        case 2:
{
do_delete(ppDb);
}
break;

        case 3:
{
do_update(ppDb);
}
break;
case 4:
{
do_search(ppDb);
}
break;
case 0: exit(EXIT_SUCCESS);
default:printf("输入有错,请重新输入\n");
}
printf("按任意键后,按回车清屏\n");
while(getchar() != '\n');
}
//关闭数据库
sqlite3_close(ppDb);
return 0;
}

2> 思维导图

3> 牛客网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98029.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-网络架构搜索

Neural Architecture Search&#xff08;NAS&#xff09; 一个神经网络有不同类型的超参数 拓扑结构&#xff1a;resnet&#xff0c;mobilenet 单独层&#xff1a;核大小&#xff0c;卷积层的通道&#xff0c;输出隐藏单元的个数NAS自动设计神经网络 如何设计搜索空间 如何探索…

云手机在办公领域中自动化的应用

云手机在办公自动化领域正逐渐展现出强大的潜力&#xff0c;以下是其在办公中自动化应用的多方面介绍&#xff1a;企业借助云手机搭载的办公软件&#xff0c;可实现文档处理自动化&#xff0c;对于重复性文档任务&#xff0c;如制作每月固定格式的销售报告、财务报表等&#xf…

c++多线程(3)------休眠函数sleep_for和sleep_until

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这两个函数都定义在 头文件中&#xff0c;属于 std::this_thread 命名空间&#xff0c;用于让当前线程暂停执行一段时间。函数功能sleep_for(rel_time)让当前线程休眠一段相对时间&…

Intel RealSense D455深度相机驱动安装与运行

Intel RealSense D455深度相机安装过程遇到过一些报错&#xff0c;所以记录一下安装过程&#xff01;&#xff01;&#xff01;以后方便回顾。 1.安装最新的IntelRealSense SDK2.0 (1) 注册服务器的公钥 sudo apt-get update && sudo apt-get upgrade && su…

从异步到半同步:全面解读MySQL复制的数据一致性保障方案

MySQL 主从复制&#xff08;Replication&#xff09;是其最核心的高可用性和扩展性功能之一。它的原理是将一个 MySQL 实例&#xff08;称为主库 Master&#xff09;的数据变更&#xff0c;自动同步到另一个或多个 MySQL 实例&#xff08;称为从库 Slave&#xff09;的过程。下…

PostgreSQL GIN 索引揭秘

文章目录什么是GIN Index?示例场景GIN Index的原理GIN Index结构MetapageEntriesLeaf PagesEntry page 和 Leaf page 的关系Posting list 和posting tree待处理列表&#xff08;Pending List&#xff09;进阶解读GIN index索引结构总结什么是GIN Index? GIN (Generalized In…

开源多模态OpenFlamingo横空出世,基于Flamingo架构实现图像文本自由对话,重塑人机交互未来

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

电子衍射模拟:基于GPU加速的MATLAB/Julia实现

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;电子衍射模拟的重要性与计算挑战 电子…

easyExcel动态应用案例

代码链接&#xff1a;https://download.csdn.net/download/ly1h1/919402991.案例说明&#xff1a;1.1.导入功能导入数据实现转换成 List<List<String>> headers和 List<List<String>> datas&#xff0c;后续补充可以与数据模型注解结合&#xff0c;形…

【数据结构入门】排序算法(5):计数排序

目录 1. 比较排序和非比较排序 2. 计数排序的原理 2.1 计数排序的弊端 3.代码复现 3.1 代码分析 3.2 排序核心 3.3 时间、空间复杂度 1. 比较排序和非比较排序 比较排序是根据排序元素的具体数值比较来进行排序&#xff1b;非比较排序则相反&#xff0c;非比较排序例如&…

输入3.8V~32V 输出2A 的DCDC降压芯片SCT9320

同志们&#xff0c;今天来个降压芯片SCT9320。输入3.8V~32V&#xff0c;输出最高可以达到2A。0.8V的参考电压。500k的开关频率。一共八个引脚&#xff0c;两个NC&#xff08;为什么不做成六个引脚呢&#xff1f;&#xff09;。EN引脚悬空或者接到VIN都可以直接启动&#xff0c;…

C++类和对象详解(2);初识类的默认成员函数

1.类的默认成员函数默认成员函数就是用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类我们不写的情况下编译器会默认生成以下的6个默认成员函数。&#xff08;1&#xff09;构造函数&#xff1a;主要完成初始化的工作&#xff08;2&#xff09…

PLC通信 Tpc客户端Socket

1.PLC通信 namespace _2.PLC通信 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//连接//1.型号: 跟PLC沟通 使用哪个型号的PLC//2.IP 同上//3.机台号:同上//4.插槽号:同上Plc plc new Plc(CpuType.S71200, "192.168.25.80", 0, 1);pr…

Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)

简介 在移动应用开发中,语音合成(TTS)技术是提升用户体验的重要工具。然而,许多开发者在集成 TTS 时面临依赖网络、需注册账号、功能受限等问题。本文将带你从零开始,通过开源项目 espeak-ng,实现无需账号、开箱即用的中文离线语音播报。 文章将覆盖以下核心内容: esp…

直播APP集成美颜SDK详解:智能美妆功能的开发实战

在这个“颜值即正义”的时代&#xff0c;用户对直播APP的第一印象&#xff0c;往往来自主播的画面质量。高清的视频固然重要&#xff0c;但如果缺少自然美颜和智能美妆功能&#xff0c;观众体验就会大打折扣。于是&#xff0c;美颜SDK成了直播行业的“标配”。今天&#xff0c;…

C++内存管理:new与delete的深层解析

1. 引言在C的世界里&#xff0c;动态内存管理是一个核心话题。对于从C语言过渡到C的开发者来说&#xff0c;一个常见的困惑是&#xff1a;既然C语言的malloc和free依然可以在C中使用&#xff0c;为什么C还要引入new和delete这两个操作符&#xff1f;本文将深入探讨这两对内存管…

【AI开发】【前后端全栈】[特殊字符] AI 时代的快速开发思维

&#x1f680; AI 时代的快速开发思维 —— 以 Django Vue3 为例的前后端分离快捷开发流程 一、AI 时代的开发新思路 在 AI 的加持下&#xff0c;软件开发不再是“纯体力活”&#xff0c;而是 思维工具自动化 的协作。 过去&#xff1a;需求 → 设计 → 开发 → 测试 → 上…

Day24_【深度学习(3)—PyTorch使用—张量的创建和类型转换】

一、创建张量1.张量基本创建方式torch.tensor 根据指定数据创建张量 &#xff08;最重要&#xff09;torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量1.1 torch.tensor# 方式一&…

3-12〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用XSS提权

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

AI 大模型赋能智慧矿山:从政策到落地的全栈解决方案

矿山行业作为能源与工业原料的核心供给端&#xff0c;长期面临 “安全生产压力大、人工效率低、技术落地难” 等痛点。随着 AI 大模型与工业互联网技术的深度融合&#xff0c;智慧矿山已从 “政策引导” 迈入 “规模化落地” 阶段。本文基于 AI 大模型智慧矿山行业解决方案&…