当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET立即上手教程(9)

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 43 ::
收藏到网摘: n/a

服务器端数据介绍

数据访问是现实世界中应用程序的核心内容。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、邮政编码和电话号码等字段时的方便。