C# Web控件与数据感应之 BaseDataList 类

目录

关于数据感应

BaseDataList 类

范例运行环境

pageview 方法

设计

实现

调用示例

数据源

调用

小结


关于数据感应

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,本文将继续介绍以与数据库提取数据并捆绑控件为例,讲解 C# 创建适用于 BaseDataList 类(如DataGrid)的通用分页数据显示方法。

BaseDataList 类

BaseDataList 类是包括如 DataList 、DataGrid 服务器控件的基类,本文我们以 DataGrid 服务器控件控件,并结合 MS SQL SERVER 和 达梦数据库,以数据分页的形式,绑定 DataGrid进行显示。

更多 BaseDataList 类的介绍请参照如下链接:

https://learn.microsoft.com/ZH-CN/dotnet/api/system.web.ui.webcontrols.basedatalist?view=netframework-4.8.1&viewFallbackFrom=net-7.0

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

数据提取:在这里我们以能够支持 MS SQL Server 2016、国产达梦数据 8 的通用数据库内容提取方法为例, 生成数据源需要利用 ADO.NET 中的数据提供者对象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用这些对象请参考我的文章:

《C#实现 IDbConnection / IDbCommand 等相关通用数据接口》

pageview 方法

设计

pageview 方法内置了分页函数写法(目前支持 MS SQL Server 2016 和国产达梦 8 数据库 ),另外传递SQL关键命令及配置相关参数,将数据源分页感应到指定的 BaseDataList 类控件上,其参数说明如下表:

序号参数名类型说明
1DbServerTypestring目前支持 "oracle"、 "dm8",其它字符串均视为 MS SQL Server
2strConnstring对应数据库的连接字符串
3webctlsstring[]

对应的信息标签和选择框的ID集合,如果不指定则按默认值处理,即:

webctls[0]="q_pageno"; //当前页
webctls[1]="q_pagecount"; //总页数
webctls[2]="q_recordcount"; //总记录数
webctls[3]="q_pagesize"; //可选择的每页记录数
webctls[4]="q_pageno_label"; //可选择的每页记录数

4navsenderstring

导航按钮的 CommandArgument,

nav1 表示首页,nav2 表示上一页,nav3表示下一页,nav4表示最后一页

5dbgrid

System.Web.UI.WebControls.

BaseDataList

用于捆绑 BaseDataList 的控件,如DataGrid

6DisplayFieldListstring用于捆绑到 BaseDataList 的控件上的字段列表,以逗号进行分隔
7SelectedFieldListstringSQL 查询语句的 select 部分,即查询字段列表,DisplayFieldList 参数是它的子集
8OrderFieldListstringSQL 查询语句的 order by  部分,字段以逗号进行分隔
9FromTableListstringSQL 查询语句的 from  部分,表名以逗号进行分隔
10WhereStatementsstringSQL 查询语句的 where  条件部分, 字符串需要书写 where 字样 
11parasArrayList查询条件中的参数对象集合
12keyfieldstring查询结果集的唯一标识字段,用于统计总数
13OuterFromTableListstring是否有用于左、右连接的表名列表
14OuterWhereStatementsstring用于左、右连接的查询条件
15movWhereToOuterbool是否用左、右连接查询条件替代where查询条件(如果需要)
16GroupFuncsArrayList一组需要特殊指定的统计变量值,其添加string[]对象,string[0] 存储字段名,string[1]存储变量名

实现

pageview 方法完整代码如下:

public string pageview(string DbServerType,string strConn,string[] webctls,string navsender,System.Web.UI.WebControls.BaseDataList dbgrid,string DisplayFieldList,string SelectedFieldList,string OrderFieldList,string FromTableList,string WhereStatements,ArrayList paras,string keyfield,string OuterFromTableList,string OuterWhereStatements,bool movWhereToOuter,ArrayList GroupFuncs)
{string[] defaultobj=new string[5];defaultobj[0]="q_pageno"; //当前页defaultobj[1]="q_pagecount"; //页总数defaultobj[2]="q_recordcount"; //总记录数defaultobj[3]="q_pagesize"; //可选择的每页记录数defaultobj[4]="q_pageno_label"; //可选择的每页记录数if(webctls==null){webctls=defaultobj;}if(webctls.GetLength(0)<4){webctls=defaultobj;}ObjectEx oe=new ObjectEx();oe.RunAt=RunAt;oe.FindContainer=FindContainer;int _npc=0;int _now=1;try{_now=int.Parse(oe.GetBaseClassText(webctls[0]));if(oe.GetBaseClassText(webctls[1])!=""){_npc=int.Parse(oe.GetBaseClassText(webctls[1]));}   }catch(Exception){_now=1;_npc=1;oe.SetBaseClassText(webctls[0],"1");oe.SetBaseClassText(webctls[1],"1");}string navtype=oe.GetBaseClassArg(navsender);if(navtype=="nav1"){_now=1;}if(navtype=="nav2"){_now--;}if(navtype=="nav3"){_now++;}if(navtype=="nav4"){_now=_npc;}if(navtype=="nav5"){_now=int.Parse(oe.GetBaseClassText(webctls[0]));}if(_now>_npc){_now=_npc;}if(_now<1){_now=1;}_now--;IDbConnection Conn = GetConnection(DbServerType, strConn);IDataReader myDr;string _countf=keyfield;string _pagesize=oe.GetBaseClassList(webctls[3],"Value");_pagesize=(_pagesize==""?"50":_pagesize);if(movWhereToOuter==true){WhereStatements=WhereStatements.Replace("where 1=1","");if(OuterWhereStatements.IndexOf("{0}")==-1){OuterWhereStatements+=" "+WhereStatements;}else{OuterWhereStatements=string.Format(OuterWhereStatements,WhereStatements);}WhereStatements="";}string groupf="",resultf="",declare="",intolist= "RecordCount";if(GroupFuncs!=null){for(int i=0;i<GroupFuncs.Count;i++){string[] rv=(string[])GroupFuncs[i];if (DbServerType.ToLower() == "dm8"){intolist += "," + rv[1] ;groupf += "," + rv[0];resultf += "," + rv[1] + " " + rv[1];declare += " " + rv[1] + " " + rv[2] + " ";}else{groupf += ",@" + rv[1] + "=" + rv[0];resultf += ",@" + rv[1] + " " + rv[1];declare += " declare @" + rv[1] + " " + rv[2] + " ";}}}string CommandText = "DECLARE    @PageIndex INT "+" DECLARE    @PageSize  INT "+" DECLARE    @RecordCount INT "+" DECLARE    @PageCount INT "+declare+"SET @PageIndex="+_now.ToString()+" "+"SET @PageSize="+_pagesize+" "+"SELECT @RecordCount =COUNT("+_countf+")"+groupf+" FROM "+FromTableList+" "+WhereStatements+" "+"SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize) "+" select @recordcount rc,@pagecount pc"+resultf+" SELECT "+DisplayFieldList+" FROM "+"(SELECT "+SelectedFieldList+","+"ROW_NUMBER() OVER (ORDER BY "+OrderFieldList+") AS sn  "+"FROM "+FromTableList+" "+WhereStatements+") AS T "+OuterFromTableList+" WHERE T.sn > (@PageIndex * @PageSize)  and T.sn <= ((@PageIndex+1) * @PageSize) "+OuterWhereStatements;if (DbServerType.ToLower() == "dm8"){CommandText = "declare PageIndex INT; " +" PageSize  INT; " +" RecordCount INT; " +" PageCount INT; " + declare +"begin SET PageIndex=" + _now.ToString() + "; " +"SET PageSize=" + _pagesize + "; " +"SELECT COUNT(" + _countf + ") " + groupf +" into "+intolist+ " FROM " + FromTableList + " " + WhereStatements + " ;" +"SET PageCount = CEILING(RecordCount * 1.0 / PageSize) ;" +" select recordcount rc,pagecount pc" + resultf +";"+" SELECT " + DisplayFieldList + " FROM " +"(SELECT " + SelectedFieldList + "," +"ROW_NUMBER() OVER (ORDER BY " + OrderFieldList + ") AS sn  " +"FROM " + FromTableList + " " + WhereStatements + ") AS T " + OuterFromTableList +" WHERE T.sn > (PageIndex * PageSize)  and T.sn <= ((PageIndex+1) * PageSize) " + OuterWhereStatements+" ;"+" end;";}string _info="";try{ArrayList _paras = new ArrayList();if(paras!=null){for(int i=0;i<paras.Count;i++){if (DbServerType.ToLower() == "dm8") {_paras.Add(paras[i] as DmParameter);}else{_paras.Add((SqlParameter)paras[i]);}}}IDbCommand Cmd = GetCommand(DbServerType, CommandText, _paras, Conn);Conn.Open();if (DbServerType.ToLower() == "dm8"){myDr = Cmd.ExecuteReader() as DmDataReader;}else{myDr = Cmd.ExecuteReader() as SqlDataReader;}if (myDr.Read()){   int pc=int.Parse(myDr["pc"].ToString());int rc=int.Parse(myDr["rc"].ToString());oe.SetBaseClassText(webctls[1],pc.ToString());oe.SetBaseClassText(webctls[2],rc.ToString());oe.SetBaseClassText(webctls[0],(_now+1).ToString());if(webctls.Length>4){oe.SetBaseClassText(webctls[4],(_now+1).ToString());}if(GroupFuncs!=null){for(int i=0;i<GroupFuncs.Count;i++){string[] rv=(string[])GroupFuncs[i];oe.SetBaseClassText(rv[3],myDr[rv[1]].ToString());}}}if(myDr.NextResult()){dbgrid.DataSource=myDr;dbgrid.DataBind();}myDr.Close();}catch (Exception ex){_info=ex.Message;}finally{Conn.Close();Conn.Dispose();}return _info;
}//pageview

pageview方法中涉及对控件ID在Page页面的查找 ,及对基类的一些属性如Text进行设置,因此设计了一个 ObjectEx 类,实现一些控件的查找和设置方法,该类设计如下:

序号成员类型说明
1public System.Web.UI.HtmlControls.HtmlForm RunAt=null;
        
属性运行的Form平台,Asp.net中一般只设置一个Form
2public System.Web.UI.Control FindContainer=null;属性要查找的容器,一般设置为Page
3public string GetBaseClassArg(string webctl)方法得到指定ID控件的 CommandArgument
4public string GetBaseClassList(string webctl,string gettype)
        
        
        
方法得到指定 ID 的 ListControl 控件的Text或Value值,gettype 参数值可以设置 Text 或 Value
5public string GetBaseClassText(string webctl)方法得到指定ID控件的 Text 属性
6public void SetBaseClassText(string webctl,string values)方法设置指定ID控件的 Text 属性

类代码如下:

public class ObjectEx
{public System.Web.UI.HtmlControls.HtmlForm RunAt=null;public System.Web.UI.Control FindContainer=null;public string GetBaseClassArg(string webctl){System.Web.UI.Control btnctl;btnctl=RunAt.FindControl(webctl);if(FindContainer!=null){btnctl=FindContainer.FindControl(webctl);}if(btnctl==null){return "";}if(btnctl.GetType()==typeof(System.Web.UI.HtmlControls.HtmlInputButton)){if(((System.Web.UI.HtmlControls.HtmlInputButton)btnctl).Attributes["CommandArgument"]!=null)return ((System.Web.UI.HtmlControls.HtmlInputButton)btnctl).Attributes["CommandArgument"].ToString();}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Button)){return ((System.Web.UI.WebControls.Button)btnctl).CommandArgument;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.ImageButton)){return ((System.Web.UI.WebControls.ImageButton)btnctl).CommandArgument;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.LinkButton)){return ((System.Web.UI.WebControls.LinkButton)btnctl).CommandArgument;}return "";}public string GetBaseClassText(string webctl){System.Web.UI.Control btnctl;btnctl=RunAt.FindControl(webctl);if(FindContainer!=null){btnctl=FindContainer.FindControl(webctl);}if(btnctl==null){return "";}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.TextBox)){return ((System.Web.UI.WebControls.TextBox)btnctl).Text;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Label)){return ((System.Web.UI.WebControls.Label)btnctl).Text;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Button)){return ((System.Web.UI.WebControls.Button)btnctl).Text;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.LinkButton)){return ((System.Web.UI.WebControls.LinkButton)btnctl).Text;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.HyperLink)){return ((System.Web.UI.WebControls.HyperLink)btnctl).Text;}return "";}public void SetBaseClassText(string webctl,string values){System.Web.UI.Control btnctl;btnctl=RunAt.FindControl(webctl);if(FindContainer!=null){btnctl=FindContainer.FindControl(webctl);}if(btnctl==null){return;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.TextBox)){((System.Web.UI.WebControls.TextBox)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Label)){((System.Web.UI.WebControls.Label)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Button)){((System.Web.UI.WebControls.Button)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.LinkButton)){((System.Web.UI.WebControls.LinkButton)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.HyperLink)){((System.Web.UI.WebControls.HyperLink)btnctl).Text=values;}}public string GetBaseClassList(string webctl,string gettype){System.Web.UI.Control btnctl;btnctl=RunAt.FindControl(webctl);if(FindContainer!=null){btnctl=FindContainer.FindControl(webctl);}if(btnctl==null){return "";}return (gettype.ToLower()=="text"?((System.Web.UI.WebControls.ListControl)btnctl).SelectedItem.Text:((System.Web.UI.WebControls.ListControl)btnctl).SelectedItem.Value);}}//ObjectEx Class

 

调用示例

数据源

我们以 MS SQL SERVER 为例,提取信息发布系统列表信息,如下图数据显示:

表(wp_infos)设计基本情况如下表:

序号字段名类型说明
1titlenvarchar(200)信息标题
2pub_timedatetime发布时间

调用

在页面放置一个ID为 dbgrid 的 DataGrid 控件和一系列的导航按钮等控件,前端示例代码如下: 

<div align="center" id="panel">
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="border:1px solid #CFE2FF; border-top:2px solid #1A5FC9; background-color:#F7F9FF;" id="table310">
<tr><td align="center"><asp:DataGrid  ID=dbgrid ShowHeader="True"
ShowFooter="False" CellPadding="0" Border="0"  forecolor="black" Runat=server EnableViewState=True /> </td>
</tr>
<tr><td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0" id="table314" bgcolor="#EEF4FF"><tr><td align="right" valign="middle" style="display:none;">  <asp:ImageButton ID=ntop CommandArgument=nav1 OnClick=navpage  ImageUrl="images/nav1.jpg" Visible="false" Runat=server/>&nbsp;&nbsp;&nbsp;&nbsp;<asp:ImageButton ID=nbtm CommandArgument=nav4 OnClick=navpage ImageUrl="images/nav4.jpg" Visible="false" Runat=server/><asp:dropdownlist  id="x_pagesize" runat="server" style="font-size:9pt;font-family:宋体"  Visible="false">   
<asp:ListItem Text="10" Value="10" />
<asp:ListItem Text="20" Value="20" selected="true"/>
<asp:ListItem Text="30" Value="30" />
<asp:ListItem Text="40" Value="40" />
<asp:ListItem Text="50" Value="50" />
<asp:ListItem Text="100" Value="100" />
</asp:dropdownlist><asp:ImageButton Text="go" id="gotopage" Visible="false" OnClick=navpage CommandArgument=nav5 ImageUrl="images/nav5.jpg" Runat=server/></td><td width="515" height="30"></td><td valign="middle" width="100" align="right">共计<asp:Label ID=nrc Runat=server/>条记录</td><td valign="middle" width="4"><img src="../images/2012/inner/inner_dg_l.jpg"></td><td valign="middle" width="46" align="center"><asp:Label ID=ngo Text="1" Runat=server/>/<asp:Label ID=npc Runat=server/></td><td valign="middle" align="left" width="135"><asp:ImageButton ID=nprv CommandArgument=nav2 OnClick=navpage ImageUrl="../images/2012/inner/inner_dg_btn_p.jpg" Runat=server/>&nbsp;&nbsp;<asp:ImageButton ID=nnxt CommandArgument=nav3 OnClick=navpage ImageUrl="../images/2012/inner/inner_dg_btn_n.jpg" Runat=server/></td></tr></table></td></tr></table>
</div>

后端调用示例代码如下:

void navpage(Object sender,EventArgs e)
{string _sql="  title,pub_time";string _wherecon="";String arg ="";try{arg=((ImageButton)sender).CommandArgument;}catch(Exception xe){arg=((LinkButton)sender).CommandArgument;}string DisplayFieldList="sn 序号,title 标题名称,pub_time 发布时间";string SelectedFieldList=_sql;string OrderFieldList="pub_time desc";string FromTableList="wp_infos";string WhereStatements="";object[] rv=GetWhere();WhereStatements=rv[0].ToString();	   string[] webctls=new string[4];webctls[0]="ngo";webctls[1]="npc";webctls[2]="nrc";webctls[3]="x_pagesize";pageview("sqlserver","您的数据连接串",webctls,((Control)sender).ID,dbgrid,DisplayFieldList,SelectedFieldList,OrderFieldList,FromTableList,WhereStatements,(ArrayList)rv[1],"id");
}
object[] GetWhere(){object[] rv=new object[2];string WhereStatements=" where 1=1 ";ArrayList paras = new ArrayList();if(q_title.Text!=""){SqlParameter   para2=new   SqlParameter("@title",SqlDbType.NVarChar,200);para2.Value=q_title.Text;paras.Add(para2);WhereStatements+=" and title like @title ";}if(q_pub_time1.Text!=""){SqlParameter   para4=new   SqlParameter("@pub_time1",SqlDbType.DateTime);para4.Value=q_pub_time1.Text;paras.Add(para4);WhereStatements+=" and pub_time>=@pub_time1 ";}if(q_pub_time2.Text!=""){SqlParameter   para5=new   SqlParameter("@pub_time2",SqlDbType.DateTime);para5.Value=q_pub_time2.Text;paras.Add(para5);WhereStatements+=" and pub_time<=@pub_time2 ";}rv[0]=WhereStatements;rv[1]=paras;return rv;}

小结

本方法同时适用于达梦8数据库的数据分页技术,我们可以根据自己的实际需要扩充兼容的数据库功能,范例中所需数据库驱动链接库,请下载我的资源:

https://download.csdn.net/download/michaelline/89235824

感谢您的阅读,希望本文能够对您有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CI522/CI523电动车NFC一键启动开发资料

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

UDP广播

1、UDP广播 1.1、广播的概念 广播&#xff1a;由一台主机向该主机所在子网内的所有主机发送数据的方式 例如 &#xff1a;192.168.3.103主机发送广播信息&#xff0c;则192.168.3.1~192.168.3.254所有主机都可以接收到数据 广播只能用UDP或原始IP实现&#xff0c;不能用TCP…

漏洞挖掘 | EDU证书站任意密码重置

1.前言&#xff1a; 挖了一段时间EDU老破小的站&#xff0c;也该拿证书站下手了。下手的第一个目标&#xff0c;那必然是漏洞排行榜第一的某交大&#xff01;&#xff01;&#xff01; 2.信息搜集 想快速挖到漏洞&#xff0c;必须信息搜集全面。如果信息搜集不到位不全面&…

明星中药企业系列洞察(二)丨百年御药同仁堂,为什么被称为我国最“硬”的老字号?

从最初的同仁堂药室、同仁堂药店到现在的北京同仁堂集团&#xff0c;经历了清王朝由强盛到衰弱、几次外敌入侵、军阀混战到新民主主义革命的历史沧桑&#xff0c;其所有制形式、企业性质、管理方式也都发生了根本性的变化&#xff0c;但同仁堂经历数代而不衰&#xff0c;在海内…

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 某城市有n个小镇&#xff0c;编号是1~n。由于贫穷和缺乏城市规划的人才&#xff0c;每个小镇有且仅有一段单向的公路通往别…

[Linux] GDB使用指南----包含CentOS7下安装以及使用

什么是GDB&#xff1f; GDB 是由 GUN 软件系统社区提供的调试工具&#xff0c;同 GCC 配套组成了一套完整的开发环境&#xff0c;GDB 是 Linux 和许多 类Unix系统的标准开发环境。可以用来调试C、C、Go、java、 objective-c、PHP等语言。 GDB的作用 程序启动时&#xff0c;可…

400 Bad Request问题

总结&#xff1a;请求路径写错了 400 问题 原地址&#xff0c;deleteSetmeal的参数应该改为param 更改请求地址正确后即可

视频质量评估

视频质量评估 一、全参考客观视频质量评价方法三、MSSIM四、STRRED五、VMAF六、MOS 一、全参考客观视频质量评价方法 全参考客观视频质量评价方法是指把原始参考视频与失真视频在每一个对应帧中的每一个对应像素之问进行比较。准确的讲&#xff0c;这种方法得到的并不是真正的…

Chromium编译指南2024 Windows11篇-Git工具准备(四)

前言 在《Chromium编译指南2024&#xff08;三&#xff09;》中&#xff0c;我们已经完成了对 Chromium 编译环境的其他相关环境变量的设置&#xff0c; 接下来&#xff0c;我们将进一步探讨如何初始化配置 Git&#xff0c;为获取 Chromium 源代码做好准备。 1. 配置Git 用户…

AI伦理和安全风险管理终极指南

人工智能&#xff08;AI&#xff09;正在迅速改变各个领域的软件开发和部署。驱动这一转变的两个关键群体为人工智能开发者和人工智能集成商。开发人员处于创建基础人工智能技术的最前沿&#xff0c;包括生成式人工智能&#xff08;GenAI&#xff09;模型、自然语言处理&#x…

VBA在Excel中字母、数字的相互转化

VBA在Excel中字母、数字的相互转化 字母转数字的方法 数字转字母的方法 众所周知,Excel表中的行以数字展示,列用字母展示,如下图: 编程时,很多时候需要将列的字母转变为数字使用,如cells(num1,num2).value等,不知大家是怎么将字母转化为数字的,Excel是否有其他方式…

今天看到一个有意思的问题:个人网站被恶意大量访问,怎么办(文末附GPT指令优化)

目录 问题描述 一、GPT 3.5 二、通义千问 三、讯飞星火 四、文心一言 五、Kimi 六、智谱清言 个人分析&#xff1a; 问题描述 大家好&#xff01;我的个人网站每天晚上7点30到11点被固定的十几个IP大量下载exe&#xff0c;造成网站带宽不够&#xff0c;怎么办! 已经把…

耕耘未来——揭秘第一产业的无限潜能

在浩瀚的科技宇宙中&#xff0c;当火星探测器的每一次着陆都能激起全球狂欢&#xff0c;当虚拟现实的浪潮让我们触碰未来&#xff0c;有一个领域&#xff0c;以其恒久不变的坚韧&#xff0c;默默地滋养着人类文明的根脉——这就是第一产业&#xff0c;那片古老而又充满生机的土…

护眼灯有没有护眼的效果?一键查看这五大护眼效果极佳的护眼台灯

在数字时代&#xff0c;护眼灯已成为保护视力的重要工具。但消费者常问&#xff1a;护眼灯有没有护眼的效果&#xff1f;挑选到技术过关的护眼台灯是能够很好地起到护眼效果的。本文将并重点介绍五款具有卓越护眼功能的台灯。这些精选灯具不仅在照明效果上表现出色&#xff0c;…

C#里如何设置输出路径,不要net7.0-windows

官网介绍&#xff1a; 更改生成输出目录 - Visual Studio (Windows) | Microsoft Learn <PropertyGroup> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</Appen…

10000字讲解IoC 思想以及五大注解

文章目录 IoC 思想通过案例讲解 IoC1.传统的开发方式 SpringIoC 和 DI五大注解ControllerServiceComponentRepositoryConfiguration 为什么要有这么多的类注解类注解之间的关系方法注解 Bean重命名 bean扫描路径 IoC 思想 什么是 Spring 呢&#xff1f; 我们经常听到的都是说…

如何使用 iOS系统恢复软件修复 iPhone 问题

苹果公司向世界推出了他们可以拥有的最智能的手机。但即使是 iPhone 也无法避免智能手机常见的损坏和问题。您将熟悉最常见的问题。屏幕黑屏或卡在 Apple 徽标上&#xff1b;冻结或卡在恢复模式的 iPhone。但这样的问题不胜枚举&#xff0c;每天都有 iOS 用户在他们的设备中遇到…

微信小程序知识点归纳(一)

前言&#xff1a;适用于有一定基础的前端开发同学&#xff0c;完成从网页开发到小程序开发的知识转换。 先立框架&#xff0c;后砌墙壁 回顾&#xff1a;了解微信小程序开发流程-CSDN博客 初始页面结构&#xff0c;三部分pages、utils、配置&#xff0c;分别存放页面、工具类…

并发控制互斥笔记

整理总结自蒋炎岩老师的b站课程&#xff0c;https://jyywiki.cn/OS/2022/index.html 多处理器系统中数据的一致性和互斥访问 所有的CPU的一级缓存都是连着的&#xff0c;如果是多个CPU的话&#xff0c;用在内存中放置标志位&#xff0c;来保证对当前内容的原子性读取&#xff0…