欢迎光临
我们一直在努力

为 ADO 程序员设计的 ADO.NET (2)-.NET教程,数据库应用

建站超值云服务器,限时71元/月

转换现有代码

有许多 asp 页面使用 ado 对象来抽取数据。让我们来讨论几种典型的情况,您在不久的将来移植和改编代码时可能会遇上这些情形。
如果您有从单个记录集生成报表的 asp 页面,datareader 对象将是您最好的伙伴。
您浏览 datareader 对象时,它会将结果输出到页面。

string strconn, strcmd; 
strconn = "database=myagenda;server=localhost;uid=sa;pwd=;"; 
strcmd = "select * from names where id=" + contactid.text; 
sqlconnection ocn = new sqlconnection(strconn); 
sqlcommand ocmd = new sqlcommand(strcmd, ocn); 
ocn.open(); 
sqldatareader dr; 
ocmd.execute(out dr); 
while (dr.read()) 
{ // 使用 dr.getstring(index) 或 
// dr["field name"] 的方法 response.write 来输出数据
} 

您还可以用 hasmorerows 属性快速检查 datareader 是否为空。如果您只需要快速浏览一系列记录,没有比 datareader 更好更快的对象了。它同样适用于查询单个记录。您不能编辑 datareader 的内容,但您可以将其内容移入更易于管理的对象,例如 datatable 或者一个或多个 datarow 对象。
当您需要处理表和记录之间的复杂关系时,datareader 就不再是合适的工具了。在 ado 中, 最终您需要处理记录集。您的数据模型链接越多,sql 命令就越复杂。导航模型仍然是顺序的,最后放入缓存的数据往往多于你所需要的。datasetdatarelation 对象是这种表关系模型的基础。
为了管理父/子关系,ado 还封装了数据形成引擎。从功能上讲,数据形成和 ado.net 关系是一样的。然而,从设计方面来看,它们几乎没有什么共同点。形成记录集将所有信息嵌入单个列表对象。ado.net 关系是您可以随时在两个数据表之间建立的动态链接。为了在执行单个 ado 命令的过程中创建一个层次结构记录集,ado 要依靠 shaping ole db 服务提供程序,并且使用特定的类 sql 语言。
在 ado.net 中,关系中涉及的每个对象总是被看成单独的个体。关系本身作为对象被公开,并且具有一定的行为规则。例如,datarelation 对象可以从父行到子行一层层进行更改。您可以通过将 foreignkeyconstraint 对象添加到 datatableconstraints 集合中来进行此操作。foreignkeyconstraint 对象表示当删除或更新数值和行时,对通过外键关系相关联的一组列的约束。如前面提到的,一旦设置好了关系,在它按程序预设终止之前,您不能进行可能破坏该关系的更改。
另外,关系是不可传递的。您可以建立两组不同的关系,例如客户和订单、订单和产品之间的关系。然而,当在订单中导航以寻找某一位客户时,您不能从一个订单跳到与之相关的产品行。您必须另外打开订单/产品关系,定位到您需要的订单,然后才能获取相关的行。这就是为什么有时候最好不要通过原来的无格式 sql join 语句实现一对一关系的原因。
需要在 asp session 对象中存储记录吗?利用 ado.net 和 dataset 对象,您可以相当安全的操作而不会导致在在 git 中存储 ado 记录集可能会导致访问冲突(英文)中所讨论的问题,也不会有线程相似性的麻烦。

更新数据

更新数据时,web 应用程序通常使用无格式 sql 语句,或者使用更好的参数化存储过程。然而,当需要使用未连接的数据时,您可能想使用内置服务来更新所有需要修订的记录。ado 提供了批更新机制来实现这个功能。
updatebatch 方法用于把保存在副本缓冲中的 recordset 更改发送到服务器,以更新数据源。它采用开放式锁定,允许所有挂起的本地更改。它还在单个操作中把所有更改传送到数据源。仅当更改提交后数据源锁定要更改的记录时,才会出现开放式锁定。开放式锁定使两个用户可以同时访问同一个记录,但一个用户输入的更改很快会被另一用户所覆盖。当然,这种方式要求数据源能够检测和防止数据冲突。还要求整个数据源比较稳定,不会发生频繁的更改。否则,不难想象协调费用将很快超过替代严格锁定所带来的节约。事实上,使用 updatebatch 方法,在任何更改失败时都会返回一个错误。然后,您可以通过 errors 集合和 error 对象来访问该错误。
要理解 ado.net 模型为什么是更新数据的更强大的工具,理解 ado 中开放式锁定的工作原理是非常关键的。在 ado 代码中,您无法控制调用 updatebatch 之后所发生的一切。也就是说,更新是在服务器上通过滚动已更改的行,然后比较原始值和数据源中对应记录中的当前值来进行的。当所有的值都一致了,才对表执行适当的 sql 语句(insert、update 或 delete)。
问题在于您不能控制实际应用于更改的 sql 语句。服务器端的更新代码并不比您编写的代码好,如果您采用非 sql 提供程序,它甚至无法运行。在本节的开头,我曾讲过 web 应用程序通常通过参数化存储过程来更新数据。然而,如果您使用批更新就不同了。
在 ado.net 中,这个模型已经有所扩展。现在它采用更通用的架构,允许您自己指定基本操作命令,例如插入、删除、更新和选择等。其用意很明显:不论何种数据源,都可以从中抽取数据并提供同样的支持。在 ado.net 中进行批更新,您需要创建 datasetcommand 对象即 sqldatasetcommandadodatasetcommand
注意:在 beta 2 中,datasetcommand 对象将被称为 dataadapter 对象。
拥有 datasetcommand 对象之后,您便可以调用它的 update 方法。datasetcommand 提供 insertcommanddeletecommandupdatecommandselectcommand 等属性。它们都是 command 对象。但是,除非默认行为无法满足需要,否则您不必设置它们。这与在 ado 中一样。在 update 过程中,如果没有设置任何 xxxcommand 属性,但是存在主键信息,将自动生成 command 对象。请注意,要使上述过程正确进行,必须为所涉及的数据表设置主键。
以下代码显示了如何为 dataset 的 employeeslist 表设置主键:

datacolumn[] keys = new datacolumn[1];
keys[0] = m_ods.tables["employeeslist"].columns["employeeid"]; 
m_ods.tables["employeeslist"].primarykey = keys;

主键基本上是 datacolumn 对象的一个数组。
如果您要使用存储过程来更新表,或者采用专用非 sql 数据提供程序,您会经常用到这些命令属性。

xml 扩展支持

在 ado 中,xml 只不过是输入和输出格式。然而在 ado.net 中,xml 是一种数据格式,提供了操作、组织、共享和传递数据的手段。任何带入 dataset 的数据,无论其来源,都能通过双面编程模型进行处理。您可以顺序交替访问信息,或者按行访问,也可以按照 xml 文档对象模型驱动的非顺序、层次结构路径进行访问。
dataset 将数据和架构作为 xml 文档进行读写。数据和架构都可以通过 http 传输,并且能在所有支持 xml 的平台上使用。相同的数据在不同的时候可以通过不同的架构来呈现,这是通过 xslt 实现的。您可以使用 readxmlschema 方法编写架构。xml 架构包括数据集中的表的说明,以及表的关系和约束。在调用 readxmldata 方法填充 dataset 之前,应该先完成这个步骤。
以下代码示例是一个显示可更新数据表的最简单的 asp.net 页面。

<%@ import namespace="system.data" %>
<%@ import namespace="system.io" %>
<script runat="server" language="c#">
void page_load(object source, eventargs e)
{   dataset data = new dataset();      
// 加载 xml 数据和架构   
streamreader sr;   
sr = new streamreader(server.mappath("data.xml"));   
data.readxml(sr);   
sr.close();      
// 添加通过 url 传递的新记录   
if (request.querystring.count >0)   
{
      datatable dt = data.tables[0];
      datarow dr = dt.newrow();
      dr["firstname"] = request.querystring["first"];
      dr["lastname"] = request.querystring["last"];
      dt.rows.add(dr);
      dt.acceptchanges();
            streamwriter sw;
      sw = new streamwriter(server.mappath("data.xml"));
      data.writexml(sw);
      sw.close();
   }
      // 刷新 ui(由网格组成)
   grid.datasource = data.tables[0].defaultview;
   grid.databind();
}
</script>

如图 2 所示,您可以将新的行添加到表中。然而,它不涉及 sql server 或 access 表。它只是一个 xml 文件,在处理它的代码中,没有使用 xml 节点或 xmldom 方法。您可以用相同的直观数据表接口来读取和更新 xml 记录。您的工作方式与在 ado 中大致相同,但此处的模型更深入、更庞大,有更多的潜力供您去发掘。

http://www.microsoft.com/china/msdn/library/techart/images/adonetdev02.gif

图 2:可更新表的示例

总结

web 应用程序的成功改变了典型分布式系统的面貌。现在大多数分布式系统都是 n 层系统,这类系统对扩展性和互操作性的要求越来越高。因此,非连接数据处理和 xml 成为最佳实践,并为业界广为接受。  
ado.net 尝试将当今一些最好的实践统一在 .net 下。这种用于数据访问的编程模型全面而又非常强大。但这个模型可能尚不能满足每一个人的要求,在将来的模型设计中还需要迈出一大步。然而,请记住现在 ado.net 还只是 beta 版,只有有限的文档支持。
ado 程序员从 beta 版中获益最多,因为他们熟悉了 ado.net 的许多方面,包括最高层次的抽象即启发性模型。ado.net 代码与现有的 ado 代码不兼容,但功能相似。要充分利用 ado.net,您应该花些功夫来理解概念本身,而不仅仅是找出移植代码的最快方式。无论您选择何种 .net 编程模型,windows 窗体、web 窗体还是 web 服务,ado.net 都会帮助您处理好数据访问的问题。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 为 ADO 程序员设计的 ADO.NET (2)-.NET教程,数据库应用
分享到: 更多 (0)

相关推荐

  • 暂无文章