首页 > 编程 > .NET > 正文

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

2024-07-10 13:12:19
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 服务器端数据介绍

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

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表