首页 > 语言 > 关键词 > 最新资讯 > 正文

ASP.NET立即上手教程(9)

2007-09-17 11:44 · 稿源:网页教学网

服务器端数据介绍

数据访问是现实世界中应用程序的核心内容。Asp.net提供了一套丰富的控件,他与CLR(通用语言运行库)提供的用来管理数据访问的APIs(应用程序接口)紧密结合。本章预排几个反复使用asp.net的DateGrid控件来绑定SQL查询结果和XML数据文件的例子。本章假定学习者熟悉数据库基础和SQL查询语言。

Wincheer注:预排(walk through)这个词不知道该怎样准确翻译,他的意思是在计算机程序设计中,在一个小组内进行有组织的讨论,以便对计算机程序的逻辑进行跟踪检查的一个过程。

服务器端数据访问比较独特,其原因在于web页面是无态的。这就导致在试图执行事务,如插入或者更新记录的时候,出现了一些有难度的挑战。正如你将在本章看到的,DataGrid控件能够帮助管理这些挑战,允许你浓缩更多的应用程序逻辑,并且减少事件处理和状态管理的细节。

Connections(连接)、Commands(命令)、和Datasets(数据集)

通用语言运行时刻(CLR)提供了一整套管理数据访问的APIs,用来增强数据应用程序开发环境。这些应用程序接口用一致的方式来取得和填充数据,而不管实际的数据源是什么(SQL Server, OLEDB, XML,等等)最常用的三个对象是connections, commands, 和 datasets.

Connection 表示到数据存储的物理连接,例如连接SQL Server 或者 XML文件。

Command 表示取得(select)或者操作(insert, update, delete)数据存储的命令。

Dataset 表示应用程序用以工作的实际数据。注意datasets 总是与他们的数据源连接和数据模型分离,并且可以被独立修改。 不过,对dataset进行修改,可以很容易的与原始数据模型协调一致。

关于在通用语言运行时刻管理数据访问的更多细节问题,请参阅ADO.NET概述。

访问基于SQL的数据

应用程序常常需要对SQL数据库执行一个或多个select, insert, update, 或者delete 语句。下面的表格展示了一些实现这些功能的示例代码。

以下为引用的内容:
功能   举例
------------------------------------------------------------------
简单查询 | SELECT * from Employees WHERE FirstName = 'Bradley';
------------------------------------------------------------------
联合查询 | SELECT * from Employees E, Managers M WHERE E.FirstName = M.FirstName;
------------------------------------------------------------------
插入   | INSERT into Employees VALUES ('123-45-6789','Bradley','Millington','Program Manager');
------------------------------------------------------------------
更新   | UPDATE Employees SET Title = 'Development Lead' WHERE FirstName = 'Bradley';
------------------------------------------------------------------
删除   | DELETE from Employees WHERE Productivity < 10;
------------------------------------------------------------------

要想让你的页面能够访问SQL数据库,必须在页面中引入System.Data 和 System.Data.SqlClient名称空间:

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

为了从SQL数据库执行select查询,你需要通过连接字符串建立一个连接到数据库的SqlConnection对象, 然后构造一个包含查询语句的SqlDataAdapter对象。为了用查询的返回结果填充到DataSet 对象,需要调用SqlDataAdapter的Fill方法。

以下为引用的内容:
SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");

正如本章前面提到的那样,使用dataset的好处在于提供了一个分离的数据库视图。你可以在应用程序中操作dataset,然后将你的修改与实际的数据库一致。对于长时间运行的应用程序来说,由于避免了频繁的读取数据源,因而是最好的处理办法。对于web应用程序来说,往往使用简短的操作(通常只是简单的显示数据)来处理客户端的请求。在这种情况下,我们就可以使用SqlDataReader来代替DataSet对象。

SqlDataReader对象提供了一种从sql数据库取得数据时,只向前,只读的指针。由于SqlDataReader对象使用表格式数据流(TDS)直接从数据库连接读取数据,所以,在允许使用的情况下,他的执行效率高于DataSet。

使用SqlDataReader对象的时候,需要使用SqlCommand来代替SqlDataAdapter。SqlCommand 使用 ExecuteReader 方法得到SqlDataReader对象。注意在使用SqlCommand的时候,必须显式地打开和关闭SqlConnection。调用ExecuteReader方法之后,SqlDataReader对象就可以作为数据源绑定到ASP.NET服务器控件了。下一个小节将会演示这种情况。

以下为引用的内容:
SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection);
myConnection.Open();
SqlDataReader dr = myCommand.ExecuteReader();
...
myConnection.Close();

当执行一条不需要返回数据的SQL命令,如inserts, updates, 和 deletes,也使用SqlCommand。该命令通过调用ExecuteNonQuery方法来执行,返回实际处理的行数。注意使用SqlCommand的时候,必须显式的打开连接;而SqlDataAdapter则自动的打开连接。

以下为引用的内容:
SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommand myCommand = new SqlCommand(
          "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'",
          myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();

重要提示:页面执行完毕之后,记得务必将数据模型的连接关闭。否则的话,当等待垃圾回收功能处理页面实例的时候,可能在不经意间就消耗尽连接数限制。

将SQL数据绑定到DataGrid

下面的例子展示了将一个简单的查询语句绑定到DataGrid 控件。DataGrid 交付了一个包含sql数据的表。

类似数据绑定那一章提到的DropDownList, DataGrid 控件支持Ienumerable或者 Icollection 类型的DataSource属性,就如同DataSet一样。你可以通过将(包含在DataSet中的)表的DefaultView属性赋值给想使用的(DataSet中的)表的名称,来使用DataSet控件, DefaultView 属性表示DataSet中当前表的状态,包含应用程序代码所作的任何改变(例如行删除或者值的改变)。设置了DataSource 属性以后,可以调用DataBind()来填充控件。

以下为引用的内容:
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();

另一个相同的语法是同时指定DataSource 和DataMember. 在本例中, ASP.NET自动为你获取了取得了DefaultView。

以下为引用的内容:
MyDataGrid.DataSource=ds;
MyDataGrid.DataMember="Authors";
MyDataGrid.DataBind();

你也可以直接绑定到SqlDataReader。如果你仅仅显示数据,那么SqlDataReader 的"只向前"特性非常适合这种场合,同时你可以得到更高的执行性能。

注意:在本章的剩余部分,我们使用的都是DataSet这种数据访问模式来演示;实际上,这些例子也同样可以使用SQLDataReader来重写。

执行用参数表示的Select命令

你也可以使用SqlDataAdapter对象来执行带参数的select语句。下面的例子演示如何使用select HtmlControl控件传递的值来改变查询的结果。

SqlDataAdapter 包含Parameters 集合,可以使用变量标识符(名称前加一个"@") 来代替值。 你可以给这个集合增加一个新的SqlParameter 来指定参数的名称、类型、和大小,然后设置他的Value属性的值。

以下为引用的内容:
myCommand.SelectCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar, 2));
myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value;

重要提示:注意DataGrid的EnableViewState属性缺省设置是false。如果在每一次页面请求时填充数据,就没有必要让DataGrid保存表单发送的状态信息。由于DataGrid保存它包含的所有的状态的数据,因此将EnableViewState关闭可以提高页面执行性能。

上面的例子静态的填充列表框的数据。如果数据库中的值已经发生了变化,这种方法就不能够很好的工作。 由于列表框也支持IEnumerable DataSource属性,所以你可以使用select查询来动态的填充列表框的值,这样可以保证数据库和用户接口总是一致的。下面的例子演示了这个过程。

在SQL数据库中插入数据

为了在数据库中插入一行记录,你可以在页面上增加一个输入表单,然后在表单提交的事件句柄中执行一条插入命令。就像上面两个例子一样,你是用命令对象的参数集合填充命令的值。在插入数据的之前,注意检查并确保从表单得到的值不能为空,这样可以避免数据库字段约束条件的意外错误。为了防止数据表中主索引与欲插入的记录重复,可以使用try/catch语句块来执行插入命令。

除了明确的检查输入数据以外,你也可以使用前面章节提到的验证控件来检查数据输入。下面的例子向你展示了如何使用做到这一点。注意正则表达式验证控件在检查作者id、邮政编码和电话号码等字段时的方便。

  • 相关推荐
  • 大家在看
  • 荣耀笔记本MagicBook Pro“用力过猛”!轻薄、大屏、性能全满足

    随着人们生活质量的逐步提高,像荣耀笔记本MagicBook Pro2020 这种可以满足用户各种需求的笔记本更受消费者欢迎。它不仅是拥有大屏的轻薄笔记本,还是性能强悍的实力型笔记本,且具备多种实用功能,这样的笔记本在市场上并不多见,被消费者称为:"用力过猛过!"下面一起来了解一下这款荣耀笔记本,感受一下属于它的魅力。荣耀笔记本MagicBook Pro2020 质量非常好,A/B/C三面都是高品质铝合金材质,经过阳极氧化工艺加工后,保持铝合

  • 中商互联集团完成中科企创信息技术研究院收购

    据悉,中科企创(北京)信息技术研究院2012年7月25日成立于北京,该研究院成立8年以来,专注电子商务诚信认证、搜索引擎大数据研究。 据企查查公示,此次收购,由中商互联集团董事会成员代持中科企创(北京)信息技术研究院100%股权。据知情人士了解,中商互联集团近期动作频繁是为了终端点商宝及采商通客户增效,此次收购完成,或许有助于中商互联集团布局国内大数据产业互联网商业效果营销领跑者愿景进一步加快实现。

  • 伴宝乐硬核上市,后疫情时代为有机行业加速赋能

    2020年的开局,新型冠状病毒这只“黑天鹅”扑面而来,消费者健康观念发生巨变,品牌生存发展遭遇全新洗牌的种种考验。在这样一个充满不确定性的后疫情时代里,如何洞察市场大势,把握新需求和新机遇,如何不断地调整自己,应对挑战,从而获得逆势飞跃增长?炫耀性需求减弱,新的消费需求出现受疫情影响,用户的心理状态和生活状态都发生了双重改变,在这一过程中,消费需求也发生了变化。中国消费者对物质的追求不再那么强烈,他们

  • 供应链称苹果iPhone 12 Pro未配备120Hz高刷新率屏幕

    ​苹果12最新消息,据Display Supply Chain Consultants 创始人 Ross Young 在推特发布的消息称,目前来自供应链内部的消息显示 iPhone 12 Pro 系列并不会采用 120Hz 刷新率的屏幕,2021 iPhone 才会有。

  • 蚂蚁庄园今日答案7.3 切蛋糕时怎么做可以使切口平整且不粘

    ​2020年7月3日到了,今天是工作日的最后一天,支付宝蚂蚁庄园小课堂的问题也更新了,今天的问题是“切蛋糕时,怎么做可以使切口平整且不粘?”这个问题其实很好回答,两个选项看着就知道选哪个了,下面就来为大家科普一下。

  • 新手小白必看的良心评测:爆款电动牙刷美看Mcomb M2开箱

    电动牙刷现在已经成为日常生活中必不可少的电子产品之一,清洁能力比普通牙刷要高出几倍,尤其是声波电动牙刷。这一两年来经常开箱评测各种电动牙刷,今天要开箱的是一款被媒体称为中高端轻奢级品牌中的第一潮牌的美看Mcomb ,正在热卖的M2电动牙刷。第一、外观篇任何一款产品,给我们的第一印象就是外观,包装好不好看,是否高大上也会直接影响我们对品牌的看法。美看Mcomb其实是一个非常有爱的国内知名品牌,多少恋人都不是朝夕?

  • Decoverf皇家帝孚:超能妈妈的N个帅气时刻!

    你眼中的家是一个地方妈妈眼中的家是有你在的时光女子本弱,为母则强每一位妈妈都活成了超人的模样儿女眼中的超人妈妈在我的心里妈妈就像超人般的存在在我的生活中扮演各种各样的角色年幼的我总是喜欢乱涂乱画家里的墙面显然成为我的天然大画板但是妈妈从未阻止过我让我可以释放天性,尽情涂鸦!▲Decoverf皇家帝孚绘巧黑板漆妈妈宛若一个梦想家为我插上隐形的翅膀给我充足的自由发挥空间不压制想象,培养我的创作力!▲Decoverf皇家

  • 马斯克卖掉洛杉矶四套房产 今年靠卖房套现近亿美元

    7月1日,马斯克以6250万美元的价格将其在美国洛杉矶的四套房产脱手,自五月起马斯克已累计出售6处房产。5 月 1 日,马斯克发推文称将出售几乎所有的有形资产,将不再拥有房子。5 月 3 日,马斯克在洛杉矶的两座豪宅分别以 3000 万美元和 950 万美元在房地产网站出售。

  • 巨人网络:参股子公司完成收购重庆赐比 间接持有Playtika公司部分股权

    【TechWeb】7月3日消息,巨人网络发布公告称,参股子公司巨堃网络于近日通过增资完成了对重庆赐比商务信息咨询有限公司的收购。截至本公告日,巨堃网络拥有重庆赐比100%的权益。重庆赐比持有 Alpha Frontier Limited(以下简称“Alpha”)9,672 股 A 类普通股(占 Alpha 总股本的 42.04%)。巨人网络通过收购重庆赐比,间接持有Alpha部分股权。Alpha 旗下的 Playtika 是一家以大数据分析及人工智能 为驱动的高科技互联网公司,目?

  • 封禁TikTok之后:印度出现100种山寨它的App

    印度通信和信息技术部 6 月 29 日宣布,出于“安全”考虑,封禁包括抖音海外版TikTok在内的 59 款中国App。22 岁的萨达姆·汗(Saddam Khan)听到这个消息的时候,正在新德里火车站当搬运工,他的头上正顶着两只客户的公文包,“我真想把包扔了然后哭一场。”萨达姆·汗说。

  • 特斯拉否认解雇未复工员工 已结束降薪政策

    特斯拉北京展厅凤凰网科技讯 北京时间7月3日消息,特斯拉公司在周四澄清称,公司并未解雇因担心其加州工厂在新冠肺炎疫情期间的安全问题而选择在家的员工。特斯拉在一篇博文中称,在其工厂获准复工后,公司已经好几周时间不再使用考勤制度,并且为员工提供了一个“不会过问的居家时间窗口”,公司的防护措施符合美国县、州以及联邦层面的指导方针。《华盛顿邮报》周三报道称,三名特斯拉员工因为选择在家不去加州工厂上班而被解雇?

  • 创号仅三月,多次上热搜,这个短视频媒体如何打造爆款?

    在过去几个月,从腾讯新闻繁星计划中诞生了一批优质内容创作者,我们邀请这批成长速度较快的新锐创作者分享自身对行业的理解,包括但不限于运营思考、趋势预测、热点解析等,帮助内容创作者理解当前行业发展,抓住不断变革中的行业机遇。

  • ​“破格”落户上海,李佳琦凭什么?

    以“特殊人才”之名,李佳琦获上海户口昨天李佳琦又上热搜了,上次是因为买房,这次是因为落户。

  • 黄峥、宿华、张一鸣:相逢在中场

    ​当我们跳到 2020 年岁末做年终财经大事盘点,少不了一句话:三个男人一台戏。1980 年出生的黄峥,今年刚好 40 岁。

  • 被指员工多年往啤酒中撒尿 百威回应网友:恶意诋毁、严重误导

    颇有名气的百威啤酒近日蒙遭负面,网上出现了关于“有员工多年来往里面尿尿”的传言。对此,百威啤酒官微7月2日晚在微博发表声明,回应称,这是对公司产品的恶意诋毁,严重误导消费

  • 老干妈上架大客户专属辣椒酱,只是促销并未他意

    近日腾讯起诉老干妈一事已经成为这两天互联网上一个热议的话题,作为当事人之一的老干妈在7月2日上架了“大客户专属的 1000 瓶辣椒酱”,该辣椒酱为套装组合出售,1000瓶售价为9999元。

  • 英特尔恢复对浪潮信息供货 浪潮称目前生产经营正常

    今日,浪潮信息在互动平台表示,公司目前生产经营正常,Intel已恢复对浪潮的供货。7月1日,有媒体报道称,浪潮信息被加入美国出口管治名单,英特尔产品出口至浪潮的产品暂停。受此影响,7月1日午后开盘,浪潮信息股价直线跳水,一度跌停。

  • 小鸡宝宝考考你今天答案是什么 夏季雨后青蛙还靠哪个器官来呼吸

    2020年7月3日,支付宝的蚂蚁庄园小课堂小鸡宝宝考考你的问题来了,今天小鸡宝宝的问题是“小鸡宝宝考考你,夏季雨后蛙声一片,除了肺之外,青蛙还靠哪个器官来呼吸?”这个很多人都不知道答案是什么,下面就来为大家详细的介绍一下。

  • 40天内就收回所有成本!豆豆是这么说爽文流这个大生意的

    ​我们对市场会有很多想象,认为高大上才是未来,但2018- 2019 年乃至现在市场讲述的故事都是下沉。在友盟+的数据中,逆势增长的版块无论从任何一个角度去看,都逃不开小说App这个细分区域。

  • 上汽集团拟出资约19亿港元:成为神州租车最大股东

    万没想到,神州租车再现新买家,上汽集团半路杀出。7月3日消息,昨日晚间,上汽集团发布公告称,公司全资子公司上汽香港与神州优车及其子公司 UCAR Limited、UCAR Service Limited、 UCAR Tec

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议

热文

  • 3 天
  • 7天