C# VS2022+WinForm+Oracle19.3+Excel,根据数据库表定义书生成SQL

目标:

用Excel写数据库的表的定义书,用该工具生成SQL,在客户端执行,把表结构导入数据库,生成真正的表

Github代码下载

目录

    • 0.完成下面开发环境的准备
      • 1 操作系统Win11 专业版 21H2
      • 2 oracle 19.3
      • 3 Visual Studio Community 2022
      • 4 数据库表定义书参照样式
    • 1 C#工程准备
      • 1.1 新建工程
      • 1.2 Form1添加控件
    • 2 添加代码
      • 2.1 button1_Click事件
      • 2.2 button2_Click事件
      • 2.3 button3_Click事件
      • 2.4 添加ColumnObject类
      • 2.5 添加共通方法,目的是实现“读入Excel到DataSet中”
    • 3 画面启动,测试结果
      • 3.1 生成如下的SQL文件
      • 3.2 SQL文件(T_PLAYER_PICTURES.SQL)内容如下
      • 3.3 最终生成的表结构

0.完成下面开发环境的准备

1 操作系统Win11 专业版 21H2

2 oracle 19.3

下载和安装手顺:https://blog.csdn.net/u011159350/article/details/125432921

3 Visual Studio Community 2022

下载地址:https://visualstudio.microsoft.com/zh-hans/vs/community/
下载后双击,选择下面两项,并安装

4 数据库表定义书参照样式

在这里插入图片描述

1 C#工程准备

1.1 新建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建完工程后,如果显示0项目(Form1.cs的设计窗口不能显示,只显示代码),可能是Donet的环境变量出问题了,可以尝试下面的方案解决
VS2022中解决方案显示0项目 | 找不到指定的SDK“Microsoft.NET.Sdk”
在这里插入图片描述

1.2 Form1添加控件

添加Label控件:
label1.Text = Oracle数据库定义书文件路径:
label2.Text = SQL文件生成的文件夹路径:
追加textBox1
追加textBox2
button1.Text = 选择
button2.Text = 选择
button3.Text = 运行(生成SQL)
调整一下Form1窗口大小
Form1的FormBorderStyle = FormBorderStyle.FixedToolWindow
Form1的StartPosition = FormStartPosition.CenterScreen;
在这里插入图片描述

2 添加代码

2.1 button1_Click事件

双击button1,添加Click事件的内容

        private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Title = "请选择文件";openFileDialog.Filter = "Excel文件(*.xlsx)|*.xlsx|所有文件(*.*)|*.*";openFileDialog.FilterIndex = 1;openFileDialog.Multiselect = false;if (openFileDialog.ShowDialog() == DialogResult.OK){textBox1.Text = openFileDialog.FileName;// 假设你的TextBox控件名为textBox1textBox1.SelectionStart = textBox1.Text.Length;textBox1.SelectionLength = 0; // 设置选择长度为0,表示没有文字被选中textBox1.Focus(); // 设置焦点到textBox1}}

2.2 button2_Click事件

双击button2,添加Click事件的内容

        private void button2_Click(object sender, EventArgs e){FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();folderBrowserDialog.Description = "请选择文件夹";if (folderBrowserDialog.ShowDialog() == DialogResult.OK){textBox2.Text = folderBrowserDialog.SelectedPath;// 假设你的TextBox控件名为textBox1textBox2.SelectionStart = textBox2.Text.Length;textBox2.SelectionLength = 0; // 设置选择长度为0,表示没有文字被选中textBox2.Focus(); // 设置焦点到textBox1}}

2.3 button3_Click事件

双击button3,添加Click事件的内容

        private void button3_Click(object sender, EventArgs e){try{string talbedesignbookpath = textBox1.Text;string sqlpath = textBox2.Text;DirectoryInfo directoryInfo = new DirectoryInfo(sqlpath);if (!directoryInfo.Exists){directoryInfo.Create();}DataSet ds = this.ReadExcelToDataSet(talbedesignbookpath);foreach (DataTable dt in ds.Tables){if (dt.TableName.Contains("$_xlnm#Print_Area")){string tableid = dt.Rows[1][2].ToString();string tablename = dt.Rows[2][2].ToString();FileInfo file = new FileInfo(sqlpath + "\\" + tableid + ".SQL");using (StreamWriter sw = file.CreateText()){sw.WriteLine("/*");sw.WriteLine("-- 作成表的中文名:" + tablename);sw.WriteLine("-- 作成表的英文名:" + tableid);sw.WriteLine("-- 作成组织:无");sw.WriteLine("-- 作成日期:" + DateTime.Now.ToString("yyyy/MM/dd"));sw.WriteLine("-- 作成者:烟图黛螺");sw.WriteLine("-- 修改历史:" + DateTime.Now.ToString("yyyy/MM/dd") + " 烟图黛螺 新建文件");sw.WriteLine("*/");sw.WriteLine("");sw.WriteLine("------- 永久删除表,不进入回收站 ----------");sw.WriteLine("DROP TABLE " + tableid + " PURGE;");sw.WriteLine("/");sw.WriteLine("");sw.WriteLine("------- 创建表 ----------");sw.WriteLine("CREATE TABLE " + tableid + " (");int maxcolumnidlen = 0;List<ColumnObject> ColumnObjectList = new List<ColumnObject>();for (int i = 0; i < dt.Rows.Count; i++){if (dt.Rows[i][3] == null || dt.Rows[i][3].ToString().Trim().Length == 0){continue;}if (i >= 4){ColumnObject columnObject = new ColumnObject();// 列汉字名if (dt.Rows[i][2] != null && dt.Rows[i][2].ToString().Trim().Length > 0){string columnname = dt.Rows[i][2].ToString();columnObject.Columnname = columnname;}// 列英文名if (dt.Rows[i][3] != null && dt.Rows[i][3].ToString().Trim().Length > 0){string columnid = dt.Rows[i][3].ToString();columnObject.Columnid = columnid;if (columnid.Length > maxcolumnidlen){maxcolumnidlen = columnid.Length;}}// 主键if (dt.Rows[i][4] != null && dt.Rows[i][4].ToString().Trim().Length > 0){string columnkey = dt.Rows[i][4].ToString();columnObject.Columnkey = columnkey;}// 是否非空if (dt.Rows[i][5] != null && dt.Rows[i][5].ToString().Trim().Length > 0){string columnnullable = dt.Rows[i][5].ToString();columnObject.Columnnullable = columnnullable;}// 类型if (dt.Rows[i][6] != null && dt.Rows[i][6].ToString().Trim().Length > 0){string columntype = dt.Rows[i][6].ToString();columnObject.Columntype = columntype;}// 整数位if (dt.Rows[i][7] != null && dt.Rows[i][7].ToString().Trim().Length > 0){string columninteger = dt.Rows[i][7].ToString();columnObject.Columninteger = columninteger;}// 小数位if (dt.Rows[i][8] != null && dt.Rows[i][8].ToString().Trim().Length > 0){string columnxiaoshu = dt.Rows[i][8].ToString();columnObject.Columnxiaoshu = columnxiaoshu;}// 默认值if (dt.Rows[i][9] != null && dt.Rows[i][9].ToString().Trim().Length > 0){string columndefault = dt.Rows[i][9].ToString();columnObject.Columndefault = columndefault;}// 约束条件if (dt.Rows[i][10] != null && dt.Rows[i][10].ToString().Trim().Length > 0){string columncheck = dt.Rows[i][10].ToString();columnObject.Columncheck = columncheck;}ColumnObjectList.Add(columnObject);}}// 创建表int index = 0;string line = string.Empty;foreach (ColumnObject co in ColumnObjectList){line = string.Empty;if (co.Columnid == null || co.Columnid.Length == 0){continue;}if (index == 0){line = line + "     " + co.Columnid.PadRight(maxcolumnidlen + 5);}else{line = line + "    ," + co.Columnid.PadRight(maxcolumnidlen + 5);}if (co.Columntype == "VARCHAR2"){line = line + " VARCHAR2(" + co.Columninteger + " CHAR)";}else if (co.Columntype == "NUMBER"){if (co.Columnxiaoshu == null || co.Columnxiaoshu.Length == 0){line = line + " NUMBER(" + co.Columninteger + ",0)";}else{line = line + " NUMBER(" + co.Columninteger + "," + co.Columnxiaoshu + ")";}}else if (co.Columntype == "DATE"){line = line + " DATE";}if (co.Columndefault != null && co.Columndefault.Length > 0){line = line + " DEFAULT " + co.Columndefault;}if (co.Columnnullable != null && co.Columnnullable.Length > 0){line = line + " NOT NULL";}sw.WriteLine(line);index = index + 1;}if (index >= 1){sw.WriteLine(");");sw.WriteLine("/");sw.WriteLine("");}// 添加触发器sw.WriteLine("------- 添加触发器 ----------");sw.WriteLine("CREATE OR REPLACE TRIGGER TRG_" + tableid + " BEFORE INSERT OR UPDATE ON " + tableid + " FOR EACH ROW");sw.WriteLine("DECLARE");sw.WriteLine("    LV_USER VARCHAR2(64 CHAR);");sw.WriteLine("    LV_CLIENTID VARCHAR2(64 CHAR);");sw.WriteLine("    LV_PROGRAMNAME VARCHAR2(50 CHAR);");sw.WriteLine("    LV_TERMINALINAL VARCHAR2(50 CHAR);");sw.WriteLine("BEGIN");sw.WriteLine("    LV_USER := SYS_CONTEXT('USERENV', 'SESSION_USER');");sw.WriteLine("    LV_CLIENTID:= SYS_CONTEXT('USERENV', 'CLIENT_INFO');");sw.WriteLine("    LV_PROGRAMNAME:= SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME');");sw.WriteLine("    LV_TERMINALINAL:= SYS_CONTEXT('USERENV', 'TERMINAL');");sw.WriteLine("");sw.WriteLine("    IF NOT LV_CLIENTID IS NULL");sw.WriteLine("        AND LENGTH(LV_CLIENTID) > 0");sw.WriteLine("    THEN");sw.WriteLine("        IF INSTR(LV_CLIENTID, ',') > 0");sw.WriteLine("        THEN");sw.WriteLine("            LV_USER := SUBSTR(LV_CLIENTID, 1, INSTR(LV_CLIENTID, ',') - 1);");sw.WriteLine("            LV_PROGRAMNAME:= SUBSTR(LV_CLIENTID, INSTR(LV_CLIENTID, ',') + 1);");sw.WriteLine("");sw.WriteLine("            IF INSTR(LV_PROGRAMNAME, ',') > 0");sw.WriteLine("            THEN");sw.WriteLine("                LV_TERMINALINAL := SUBSTR(LV_PROGRAMNAME, INSTR(LV_PROGRAMNAME, ',') + 1);");sw.WriteLine("                LV_PROGRAMNAME:= SUBSTR(LV_PROGRAMNAME, 1, INSTR(LV_PROGRAMNAME, ',') - 1);");sw.WriteLine("            END IF;");sw.WriteLine("        ELSE");sw.WriteLine("            LV_USER := LV_CLIENTID;");sw.WriteLine("        END IF;");sw.WriteLine("    ELSE");sw.WriteLine("        LV_USER := LV_USER || ',' || LV_PROGRAMNAME;");sw.WriteLine("    END IF;");sw.WriteLine("");sw.WriteLine("    IF INSERTING");sw.WriteLine("    THEN");sw.WriteLine("        : new.INSTID := LV_USER;");sw.WriteLine("        :new.INSTDT := sysdate;");sw.WriteLine("        :new.INSTTERM := LV_TERMINALINAL;");sw.WriteLine("        :new.INSTPRGNM := LV_PROGRAMNAME;");sw.WriteLine("    END IF;");sw.WriteLine("");sw.WriteLine("    IF INSERTING OR UPDATING");sw.WriteLine("    THEN");sw.WriteLine("        : new.UPDTID := LV_USER;");sw.WriteLine("        :new.UPDTDT := sysdate;");sw.WriteLine("        :new.UPDTTERM := LV_TERMINALINAL;");sw.WriteLine("        :new.UPDTPRGNM := LV_PROGRAMNAME;");sw.WriteLine("    END IF;");sw.WriteLine("END;");sw.WriteLine("/");sw.WriteLine("");// 添加主键索引sw.WriteLine("-------添加主键索引----------");index = 0;line = "ALTER TABLE " + tableid + " ADD CONSTRAINT PK_" + tableid + " PRIMARY KEY (";foreach (ColumnObject co in ColumnObjectList){if (co.Columnkey != null && co.Columnkey.Length > 0){if (index == 0){line = line + co.Columnid;}else{line = line + "," + co.Columnid;}index = index + 1;}}line = line + ");";if (index >= 1){sw.WriteLine(line);sw.WriteLine("/");sw.WriteLine("");}// 添加约束条件sw.WriteLine("------- 添加约束条件 ----------");foreach (ColumnObject co in ColumnObjectList){if (co.Columncheck != null && co.Columncheck.Length > 0){line = "ALTER TABLE " + tableid + " ADD CONSTRAINT CHECK_" + tableid + "_" + co.Columnid + "_1 CHECK(" + co.Columncheck + ");";sw.WriteLine(line);sw.WriteLine("/");}}sw.WriteLine("");// 添加表和列名的注释sw.WriteLine("------- 添加表和列名的注释 ----------");line = "COMMENT ON TABLE " + tableid + " IS '" + tablename + "';";sw.WriteLine(line);sw.WriteLine("/");foreach (ColumnObject co in ColumnObjectList){line = "COMMENT ON COLUMN " + tableid + "." + co.Columnid + " IS '" + co.Columnname + "';";sw.WriteLine(line);sw.WriteLine("/");}}}}MessageBox.Show(sqlpath + Environment.NewLine + "SQL文件生成完了");}catch (Exception ex){MessageBox.Show(ex.ToString());}}

2.4 添加ColumnObject类

在namespace WindowsFormsApp2下添加如下的代码

    public class ColumnObject{// 列汉字名private string columnname;// 列英文名private string columnid;// 主键private string columnkey;// 是否非空private string columnnullable;// 类型private string columntype;// 整数位private string columninteger;// 小数位private string columnxiaoshu;// 默认值private string columndefault;// 约束条件private string columncheck;public string Columnname { get => columnname; set => columnname = value; }public string Columnid { get => columnid; set => columnid = value; }public string Columnkey { get => columnkey; set => columnkey = value; }public string Columnnullable { get => columnnullable; set => columnnullable = value; }public string Columntype { get => columntype; set => columntype = value; }public string Columninteger { get => columninteger; set => columninteger = value; }public string Columnxiaoshu { get => columnxiaoshu; set => columnxiaoshu = value; }public string Columndefault { get => columndefault; set => columndefault = value; }public string Columncheck { get => columncheck; set => columncheck = value; }}

2.5 添加共通方法,目的是实现“读入Excel到DataSet中”

在Form1下边添加下面的方法和button1_Click同一层

        private DataSet ReadExcelToDataSet(string path){//连接字符串/* 备注:添加 IMEX=1 表示将所有列当做字符串读取,实际应该不是这样,系统默认会查看前8行如果有字符串,则该列会识别为字符串列。如果前8行都是数字,则还是会识别为数字列,日期也一样;如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少*/string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;IMEX=1';";using (OleDbConnection conn = new OleDbConnection(connstring)){conn.Open();DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });//存放所有的sheetDataSet set = new DataSet();for (int i = 0; i < sheetsName.Rows.Count; i++){string sheetName = sheetsName.Rows[i][2].ToString();string sql = string.Format("SELECT * FROM [{0}]", sheetName);OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);ada.Fill(set);set.Tables[i].TableName = sheetName;}return set;}}

在这里插入图片描述
搜索Excel,选择“Microsoft.Office.Interop.Excel”并安装
在这里插入图片描述
在这里插入图片描述
搜索“oledb”,选择并安装“System.Data.OleDb”
在这里插入图片描述
在这里插入图片描述
然后Form.cs的using部分,修改为如下内容

using Microsoft.Office.Interop.Excel;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Drawing;
using DataTable = System.Data.DataTable;

3 画面启动,测试结果

在这里插入图片描述

3.1 生成如下的SQL文件

在这里插入图片描述

3.2 SQL文件(T_PLAYER_PICTURES.SQL)内容如下

/*
-- 作成表的中文名:选手定妆照表
-- 作成表的英文名:T_PLAYLER_PICTURES
-- 作成组织:无
-- 作成日期:2024/02/15
-- 作成者:烟图黛螺
-- 修改历史:2024/02/15 烟图黛螺 新建文件
*/------- 永久删除表,不进入回收站 ----------
DROP TABLE T_PLAYLER_PICTURES PURGE;
/------- 创建表 ----------
CREATE TABLE T_PLAYLER_PICTURES (INSTID         VARCHAR2(64 CHAR) NOT NULL,INSTDT         DATE NOT NULL,INSTTERM       VARCHAR2(50 CHAR) NOT NULL,INSTPRGNM      VARCHAR2(50 CHAR) NOT NULL,UPDTID         VARCHAR2(64 CHAR) NOT NULL,UPDTDT         DATE NOT NULL,UPDTTERM       VARCHAR2(50 CHAR) NOT NULL,UPDTPRGNM      VARCHAR2(50 CHAR) NOT NULL,PICTURENO      VARCHAR2(20 CHAR) NOT NULL,NUM            NUMBER(3,0) DEFAULT 1 NOT NULL,MEMBER_ID      VARCHAR2(5 CHAR) NOT NULL,PICURL         VARCHAR2(100 CHAR) NOT NULL,USEKBN         VARCHAR2(1 CHAR) DEFAULT 1 NOT NULL
);
/------- 添加触发器 ----------
CREATE OR REPLACE TRIGGER TRG_T_PLAYLER_PICTURES BEFORE INSERT OR UPDATE ON T_PLAYLER_PICTURES FOR EACH ROW
DECLARELV_USER VARCHAR2(64 CHAR);LV_CLIENTID VARCHAR2(64 CHAR);LV_PROGRAMNAME VARCHAR2(50 CHAR);LV_TERMINALINAL VARCHAR2(50 CHAR);
BEGINLV_USER := SYS_CONTEXT('USERENV', 'SESSION_USER');LV_CLIENTID:= SYS_CONTEXT('USERENV', 'CLIENT_INFO');LV_PROGRAMNAME:= SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME');LV_TERMINALINAL:= SYS_CONTEXT('USERENV', 'TERMINAL');IF NOT LV_CLIENTID IS NULLAND LENGTH(LV_CLIENTID) > 0THENIF INSTR(LV_CLIENTID, ',') > 0THENLV_USER := SUBSTR(LV_CLIENTID, 1, INSTR(LV_CLIENTID, ',') - 1);LV_PROGRAMNAME:= SUBSTR(LV_CLIENTID, INSTR(LV_CLIENTID, ',') + 1);IF INSTR(LV_PROGRAMNAME, ',') > 0THENLV_TERMINALINAL := SUBSTR(LV_PROGRAMNAME, INSTR(LV_PROGRAMNAME, ',') + 1);LV_PROGRAMNAME:= SUBSTR(LV_PROGRAMNAME, 1, INSTR(LV_PROGRAMNAME, ',') - 1);END IF;ELSELV_USER := LV_CLIENTID;END IF;ELSELV_USER := LV_USER || ',' || LV_PROGRAMNAME;END IF;IF INSERTINGTHEN: new.INSTID := LV_USER;:new.INSTDT := sysdate;:new.INSTTERM := LV_TERMINALINAL;:new.INSTPRGNM := LV_PROGRAMNAME;END IF;IF INSERTING OR UPDATINGTHEN: new.UPDTID := LV_USER;:new.UPDTDT := sysdate;:new.UPDTTERM := LV_TERMINALINAL;:new.UPDTPRGNM := LV_PROGRAMNAME;END IF;
END;
/-------添加主键索引----------
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT PK_T_PLAYLER_PICTURES PRIMARY KEY (PICTURENO);
/------- 添加约束条件 ----------
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT CHECK_T_PLAYLER_PICTURES_NUM_1 CHECK(NUM >= 1);
/
ALTER TABLE T_PLAYLER_PICTURES ADD CONSTRAINT CHECK_T_PLAYLER_PICTURES_USEKBN_1 CHECK(USEKBN IN (0,1));
/------- 添加表和列名的注释 ----------
COMMENT ON TABLE T_PLAYLER_PICTURES IS '选手定妆照表';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTID IS '登陆者名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTDT IS '登陆时间';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTTERM IS '登陆客户端名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.INSTPRGNM IS '登陆程序名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTID IS '更新者名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTDT IS '更新时间';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTTERM IS '更新客户端名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.UPDTPRGNM IS '更新程序名';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.PICTURENO IS '定妆照编号';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.NUM IS '连番';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.MEMBER_ID IS '人员ID';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.PICURL IS '选手照图片地址';
/
COMMENT ON COLUMN T_PLAYLER_PICTURES.USEKBN IS '背景作用';
/

3.3 最终生成的表结构

把上面生成的SQL,复制到SQL Developer中,执行SQL,在数据库中创建表
在这里插入图片描述
执行成功后,得到下面的表
在这里插入图片描述
前8列由触发器自动登录和更新数据,第9列以后才是用户登录的数据
在这里插入图片描述
到这里就完成了。

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

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

相关文章

C++,stl,常用遍历查找算法

目录​​​​​​​ 1.常用遍历算法 for_each transform 2.常用查找算法 find find_if adjacent_find binary_search count count_if 1.常用遍历算法 for_each #include<bits/stdc.h> using namespace std;void print(int v) {cout << v << ; }…

AVL_Cruise后处理(中文

下载 https://download.csdn.net/download/jintaihu/68332464

Linux--编译器-gcc/g++使用

目录 前言 1.看一段样例 2.程序的翻译过程 1.第一个阶段&#xff1a;预处理 2.第二个阶段&#xff1a;编译 3.第三个阶段&#xff1a;汇编 4.第四个阶段&#xff1a;链接 3.程序的编译为什么是这个样子&#xff1f; 4. 关于编译器 5.链接&#xff08;动静态链接&#x…

Three.js学习7:dat.GUI 参数控制

-----------------------------华丽的分割线--------------------- 相关代码均已上传到 gitee 中&#xff1a;myThree: 学习 Three.js &#xff0c;努力加油~&#xff01; Gitee 静态演示地址&#xff1a;Three JS 演示页面 -----------------------------华丽的分割线------…

TCP_IP(6)

网络层 在复杂的网络环境中确定一个合适的路径. IP协议 与TCP协议并列,都是网络体系中最核心的协议. 基本概念 主机:配有IP地址,但是不进行路由控制的设备; 路由器:即配有IP地址,又能进行路由控制; 节点:主机和路由器的统称; 协议头格式 4位版本号(version):指定IP协议的版…

【面试】盘点10个高频的前端算法题,你全都会了吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 现在前端的面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂更是必考算…

字符输入/输出和输入验证 DAY19

文章目录 前言一、单字符I/O二、缓冲区为什么要引入缓冲区&#xff1f;文件结尾补充**注意几点** 重定向和文件重定向输入cmd是什么&#xff1f;重定向输出组合重定向小试牛刀&#xff1a;文件输出 创建更友好的用户界面使用缓冲输入 如果您发现文章有错误请与我留言&#xff0…

STM32,嵌入式系统中的I2C协议

I2C协议——读写EEPROM 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、协议简介二、I2C特性及架构三、通信过程 前言 这是一种主要用于集成电路和集成电路&#xff08;IC&#xff09;通信&#xff0c;计算机中复杂的问题大多数就是用分层来进行解决&#xff0c;这个…

OpenAI 文生视频大模型Sora,看完别说WC啊

OpenAI&#xff0c;发布了他们的文生视频大模型Sora&#xff08;Sora 是一个 AI 模型&#xff0c;可以根据文本指令创建现实且富有想象力的场景&#xff09; 来感受下震撼视觉冲击&#xff0c;看看你有没有说WC… 地址&#xff1a;sora 提示&#xff1a;一位时尚女性走在充满…

51单片机项目(30)——基于51单片机的心率血氧脉搏检测的proteus仿真

1.功能设计 可以测量脉搏、心率、血氧浓度、体温&#xff0c;并且实时显示在LCD1602屏幕上&#xff0c;&#xff08;第一行是体温血氧&#xff0c;第二行是心率脉搏&#xff09;。 &#xff08;需要完整源文件的&#xff0c;直接看最后一节&#xff09; 另外&#xff0c;还…

开源软件的影响力:塑造数字世界的无形之手

随着科技的飞速发展&#xff0c;开源软件已经成为了推动数字世界发展的重要力量。它不仅改变了软件开发的传统模式&#xff0c;还对整个科技行业乃至社会产生了深远的影响。在这篇文章中&#xff0c;我们将探讨开源软件的影响力以及它如何塑造我们的数字世界。 一、开源软件的…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

Peter算法小课堂—哈希与哈希表

额……字符串我们是第一次学&#xff0c;给大家铺一些基础的不能再基础的基础&#xff0c; 字符串比较大小 字符串大小的比较&#xff0c;不是以字符串的长度直接决定&#xff0c;而是从最左边第一个字符开始比较&#xff0c;大者为大&#xff0c;小者为小&#xff0c;若相等…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…

嵌入式中I2C 相关的硬件问题汇总及死锁解决办法

本文主要介绍如何解决I2C设备硬件设计上的各种问题&#xff0c;希望对大家有所帮助&#xff01; 关于I2C协议详细的讲解&#xff0c;可以参考之前的推文&#xff1a;全面解析 I2C 通信协议 一般情况下&#xff0c; i2c 设备焊接没什么问题&#xff0c;按照设备手册一步步来&a…

Github 2024-02-15 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-15统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目2Solidity项目2Rust项目1JavaScript项目1Go项目1C项目1 Terraform: 以安全和可预测…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

[职场] 优质简历怎么做 #学习方法#笔记

优质简历怎么做 简历是求职的“敲门砖”&#xff0c;直接影响着求职成败。然而&#xff0c;不少求职者对简历不太重视&#xff0c;认为简历就是写自己的经历。因此&#xff0c;在招聘现场&#xff0c;常会看到这样的简历&#xff1a;有的是从某招聘网站直接下载而来&#xff0c…

kali无线渗透之用wps加密模式破解出wpa模式的密码12

WPS(Wi-Fi Protected Setup&#xff0c;Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病&#xff0c;使用者往往会因为步骤太过麻烦&#xff0c;以致干脆不做任何加密安全设定&…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…