C# web 网页刷新时数据集的保存和应用
设计 Web 应用程序中的数据访问时,您要做出多种选择,例如与数据源通信的方式、是否在页的往返过程之间存储数据、以及如果确实要存储数据应存储在何处等。您所做的选择可以确定应用程序的运行效率及其缩放的良好程度。没有一个数据访问策略是适合于所有情况的。实际上,每一种选择都有其自身的优缺点,您将需要了解这些优缺点。
以下各节详述了您必须为 Web 窗体数据访问所做的基本设计选择。这些选择是按顺序提供的;每一种选择都建立在您前面所做出的选择的基础之上。
数据集还是直接访问和数据阅读器?
一项重要的选择是要将记录缓存在数据集中还是直接访问数据库并使用数据阅读器读取记录。对于某些数据库操作(如创建和编辑数据库结构),不能使用数据集。例如,如果想从应用程序内创建一个新的数据库表,则不能使用数据集来完成;而应执行一条数据命令。但对于一般的数据访问,常常有将记录存储在断开连接的数据集内和使用数据命令直接操作数据库两种方法可供选择。
注意 有关数据集的详细信息,请参见 数据集介绍。有关直接访问数据库的详细信息,请参见 Visual Studio 中的 DataCommand 对象介绍。
每一种策略都具有适用于任何数据访问方案(而不只是 Web 窗体页)的内在优点。例如,数据集简化了对相关表的处理以及对来自完全不同的源的数据的处理。另一方面,使用数据阅读器通常会略微地提高性能和内存使用率,它消除了填充数据集的额外步骤(和内存要求),并使您能够更直接地控制所使用的语句或存储过程。有关这些方法中各方法优点大体比较的详细信息,请参见 数据访问策略建议。
Web 窗体页中的数据集和数据命令
当使用 Web 窗体页时,有一些附加的因素会影响到是使用数据集还是使用数据阅读器的决定。一个重要因素就是页生命周期(由每一往返过程初始化、处理、然后放弃 Web 窗体页的过程)。如果只是想要在页上显示数据,则创建数据集、填充数据集、然后将控件绑定到数据集的这一过程可能意味着不必要的系统开销,因为该数据集将被立即放弃。在许多情况下,更为有效的方法使用数据阅读器获取数据并在运行时将控件绑定到该数据。
提示 无论决定采用何种方式从数据源获取数据,都应始终尝试将在页中使用的数据量降至最低。查询或存储过程送回的数据越多,所使用的数据库和服务器资源也就越多。
因此,在一般情况下可以认为在 Web 窗体页中,通常最好使用数据命令来执行 SQL 语句或存储过程,并使用数据阅读器来获取数据。例如,若要在DataList 命令中显示信息,可以执行一个 SQL 语句,然后将该控件绑定到一个数据阅读器。该一般性规则可能不适用于以下情况:
- 使用相关表 数据集使您可以维护多个相关表并包括对关系和引用完整性的支持。与独立地使用对数据库执行命令的方法来获取记录相比,在数据集中处理相关记录(例如,读取父记录和相应的子记录)要简单得多。
- 与其他进程交换数据 如果您的 Web 窗体页正在从另一个组件(例如 XML Web services)获取数据,您将几乎总是使用数据集来保留数据的本地副本。数据集自动读取和写入用来在 .NET Framework 中的各组件间进行通信的 XML 流。
- 使用静态记录集 如果您需要重复使用同一个记录集(例如,当用户在网格中分页时)与通过每一往返过程返回到数据源相比,将那些记录填充到数据集可能效率更高。如果需要保留一组要从频繁更改的数据库中使用的特定记录,则尤其如此。
使用数据集的一个更为一般性的优点是它比直接使用数据命令更易于编程。但是,您必须基于其他的应用程序要求仔细权衡这一优点。
有关使用数据命令的详细信息,请参见 Visual Studio 中的 DataCommand 对象介绍。
保存数据集还是每次重新创建?
如果您选择使用数据集,您的下一个选择就是确定是否要通过每一往返过程重新创建该数据集。有两个选择:
- 每次处理页时,都创建数据集的实例并填充它。在完成页处理并将该页发送到浏览器后,放弃该数据集。
- 只创建和填充一次数据集(通常是在该页第一次运行时)。然后采用某种方式保存该数据集,这种方式允许您通过以后的每次往返过程来检索它。
每次创建数据集意味着通过每一往返过程(实际上是每次用户单击页上按钮时)对数据源执行查询或存储过程。例如,您可能具有一个 Web 窗体页,用户希望在该页中逐页查看数据。如果您每次创建该数据集,则 Web 窗体页对数据源执行查询以获取下一组要显示的记录。
提示 请记住始终将数据传输量减到最小。只要可行,就使用选择条件来减少在一页上所需记录的数目。
另一方面,如果您保存和还原该数据集,您就不需要返回到源来只是获取稍多的记录。但是,保存数据集有很多缺点。其中重要的一点在于数据集在往返过程之间占用内存。例如,如果数据集非常大,它就可能占用相当多的服务器内存来存储它。如果有几个用户都创建了大型数据集,您可能很快就会耗尽可用的服务器内存。(可以选择在页中存储数据;有关详细信息,请参见下一节。)
另一个潜在的缺点在于数据集可能与数据源失去同步,因为每次用户单击按钮时您没有刷新数据集。如果使用非常易失的数据(例如清单数据),可能发现对于您的应用程序而言,通过每一往返过程重新创建数据集会更好一些。
在服务器上缓存还是在客户端上缓存?
如果您决定在往返过程之间保存数据集,则您必须决定在哪里保留它。此问题是 Web 窗体页中状态维护的标准问题之一:在往返过程间要在哪里存储您要保留的信息?有关保存值的信息,请参见 Web 窗体状态管理。
有两个选择:
- 在服务器上,以会话状态、应用程序状态或使用缓存保存数据集。
- 在客户端上(也就是说,在页中)使用视图状态或通过将数据放置到您自己的隐藏域中来保存数据集。(视图状态也使用隐藏域实现。)
在服务器上存储数据集使用服务器资源。如果存储过多的数据(大型数据集,或者许多用户存储多个小数据集),这可能会影响服务器的性能和可缩放性。使用缓存可以部分弥补这一问题,因为在服务器需要内存或缓存的数据过期时,缓存管理器将放弃该数据集。但因为并不确保数据集处于缓存中,所以必须向页中添加逻辑以检查在缓存中该数据集是否可用;如果不可用,则必须重新创建该数据集并将副本放回到缓存中。
在页中存储数据意味着不需要服务器资源来存储数据。但是,该数据将成为此页的 HTML 流的一部分。如果数据集较大,可能会显著影响将该页加载到用户的浏览器以及将该页回发到服务器所花的时间。有关以视图状态保存数据的详细信息,请参见 使用视图状态保存 Web 窗体页值。
提示 通过只用您所需的记录填充数据集,始终尽量将数据集的大小保持为最小。
无论您决定在哪里存储数据集,都必须向页上添加逻辑以在适当的时间保存和还原该数据集。下面的示例说明以会话状态存储和还原数据集的典型方式。数据集 dsCustomers1 是数据集类 dsCustomers 的实例。请注意,该数据集在会话状态中作为 Object 类型存储。当从会话状态还原该数据集时,必须将其从 Object 转换回数据集类。
- 'Visual Basic
- Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- If Page.IsPostBack Then
- dsCustomers1 = CType(Session("myDsCustomers"), dsCustomers)
- Else
- If Session("myDsCustomers") Is Nothing Then
- OleDbDataAdapter1.Fill(dsCustomers1)
- Session("myDsCustomers") = dsCustomers1
- End If
- End If
- End Sub
- //C#
- private void Page_Load(object sender, System.EventArgs e)
- {
- // Put user code to initialize the page here
- if (Page.IsPostBack)
- {
- dsCustomers1 = (dsCustomers) Session["myDsCustomers"];
- }
- else
- {
- if (Session["myDsCustomers"] == null)
- {
- oleDbDataAdapter1.Fill(dsCustomers1);
- Session["myDsCustomers"] = dsCustomers1;
- }
- }
- }
C# web 网页刷新时数据集的保存和应用的更多相关文章
- 彻底解决Yii2中网页刷新时验证码不刷新的问题
修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php这个文件就可以了,修改的地方见下图: 总结 归根到底,是因为yii2在渲染网页的时候,会先输出js验 ...
- 解决网页刷新时,隐藏div元素闪现问题
最近项目遇到一个问题,需要对一个div中的元素设置根据不同的情况进行显示和隐藏. 因为默认该div是显示的,所以在刷新页面的时候,会先加载这个div进行显示,加载完成后又执行到 hide() 方法,使 ...
- web网页测试用例(非常实用)
转自:http://blog.csdn.net/yuki_ying/article/details/54946541 一.Web测试中,各类web控件测试点总结 一 .界面检查 进入一个页面测试,首先 ...
- TI IPNC Web网页之网页修改教程
web网页程序修改 打开gStudio之后,点击菜单栏中Help->Contents.先把这个诡异的编程语言看一遍吧.这里搬一些东西出来. GoDB简介 从第一副图片中,我们可以看出,从源文件到 ...
- TI IPNC Web网页之流程分析
流程 Appro IPNC使用的web服务器是boa. 请仔细理解下面这段话. boa这个web服务器是GUI界面和IPNC应用程序之间的通信的桥梁.它的责任是从web GUI中接收HTTP请求,并且 ...
- ASP.NET 使用Session,避免用户F5刷新时重复提交(转)
1.使用Session,避免用户重复提交(F5刷新时) 0.起因 当用户上传文件后F5刷新浏览器会导致文件的重复提交和相关程序的重复执行. 1.实现原理 由于刷新提 ...
- Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页
webbrowser- 方便的Web浏览器控制器,是Python一个模块,可实现自动打开关.定时打开关闭网页/刷新网页,在Unix下,图形浏览器在X11下更受欢迎,但如果图形浏览器不可用或X11显示器 ...
- 【Python之路】特别篇--微信Web网页版通信的全过程分析
文章所使用Python版本为py3.5 1.微信服务器返回一个会话ID 微信Web版本不使用用户名和密码直接登录,而是采用二维码登录,所以服务器需要首先分配一个唯一的会话ID,用来标识当前的一次登录. ...
- C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>中介绍了目前市场主流 ...
随机推荐
- Myeclipse配置mybatis的xml自动提示
关于mapper的xml的文件的自动提示 mapper头: <?xml version="1.0" encoding="UTF-8"?><!D ...
- 九度OJ 1107 搬水果 -- 哈夫曼树 2011年吉林大学计算机研究生机试真题
题目地址:http://ac.jobdu.com/problem.php?pid=1107 题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果 ...
- linux下shell编程示例-获取进程id
今天初步学习了一下linux下的shell编程,简单记录一下测试用例 1.编辑shell脚本文件如下: #!/bin/bashecho "hello bash linux"echo ...
- Linux文件权限学习总结
一.用户对文件或目录都有哪些权限? 四种:读.写.执行.没有权限 二.如何表示这四种权限? 如果用十进制数字表示,分别为:4.2.1.0:如果用字符表示,分别为:r.w.x.-.个人觉得,使用chmo ...
- 用eclipse建立简单WebService客户端,使用WSDL,用于短信接口发送
使用工具:eclipse 标准版,不用任何插件. 操作步骤: 建立java Project 命名为mess: 再在project上右键,选择other,选择web service文件类别,选择web ...
- jquery阻止事件的两种实现方式
再阻止事件冒泡的方面,jquery有两种方式: 一种是 return false;另外一种是 e.stopPropagation() html代码 <form id="form1&qu ...
- jQuery登陆判断简单实现代码
登陆判断在实际应用中还是比较常见,在客户端执行判断可以减少服务器端的负担,感兴趣的朋友可以参考下 复制代码代码如下: <script src="jquery-1.9.1.js" ...
- ubuntu下php开发环境搭建,nginx+(cgi)php5fpm+memcached+xdebug
由于只是开发环境,所以都是选择比较简单的apt-get安装方式 ,但中间也遇到一点问题. 首先安装nginx nginx的安装和配置其实很简单,nginx本身非常轻量级, 直接 sudo apt-ge ...
- Python中的redis学习笔记
redis是一个key-value结构的数据库,value的格式可以使string,set,list,map(即python里面的dict),sorted set(有序集合) 1.初始化 1)直接连接 ...
- URL传参中不能带特殊的字符以及处理方案
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 ...