动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 软件工程 ]的信息

本月文章推荐
.JAVA设计模式之事务处理.
.简单对象协议(SOAP)简介.
.用UML描述工作流管理(1).
.软件配置管理实施体会.
.QA与QC的良性协作.
.五种全面质量管理工具.
.解析本土化软件配置管理.
.为网络服务制作文档.
.技术专家带你您走出SOA六大误区.
..NET中加密和解密的实现方法.
.客户关系管理的三大纪律.
.添加聪明角色 让网页动起来.
.献给汇编初学者-函数调用堆栈变.
.对.Net事件委托的深入分析.
.用好2005之使用强类型DataSet简化.
.设计安全的Visual Studio.NET互联.
.UML建模工具比较.
.六西格玛失败经验谈.
.解析SOA反模式(1).
.关于项目团队的发展阶段特点、问.

用ADO.NET处理层次数据

发表日期:2008-3-23 |



  ADO.NET 为数据在内存中的操作和储存提供了一种新模式。因此,我们在处理层次数据时该换换脑了。本文将对其独到之处作一个简单的描述。

  读者要求:基本把握 Visual C#.NET 、DataAdapter 和 DataSet 。

  环境

  [配置一]
  操作系统: windows 2000 服务器
  计算机: Dell Inspiron 8000 笔记本
  內存: 512mb
  处理器: PIII 750 MHz
  工具: .NET SDK Beta 2
  数据库: SQL 服务器 2000 的 Pubs 数据库

  [配置二]
  操作系统: Windows XP Professional
  计算机:Network! 3000 笔记本
  內存:256mb
  处理器: PIII 850 MHz
  工具:.NET Final
  数据库:MSDE 的 Pubs 数据库

  简单的数据检索

  我们首先要做的是通过 SQLAdapter 向数据库提交两个查询语句。

  本例中,SQLAdapter 使用由两个 select 语句组成的 SQL 命令分别向 Pubs 数据库中的两个 table 发出查询请求:

  string sSQL = "SELECT Pub_Id, Title, Price FROM; SELECT Pub_ID, Pub_Name FROM Publishers"

  在 fill 模式下, SQLAdapter 将在查询命令前插入 sp_executesql ,再以 RPC 的形式一并提交给数据库:

Exec sp_executesql
N'SELECT Pub_Id, Title, Price FROM Titles; SELECT Pub_ID, Pub_Name FROM Publishers'
  数据库也通过 RPC 返回两个 rowset。在 Dataset 中,rowset 与基本表是一一对应的。不幸的是,在 fill 模式下无法对这些基本表命名。相反,它为所有基本表提供一个共同的基本名。事实上,基本名就是第一个基本表的名字。随后的基本表命名都是在基本名后面加上一个不同的数字以互相区别,例如:Titles ,Titles1等。但是,通过简单的属性设置就能给所有基本表命名了:

daTest.Fill(dsTest, "Titles")
dsTest.Tables[1].TableName = "Publishers"
  这种显式命名有助于基本表的处理和引用。
  关于存储过程

在 ADO.NET 中如何使用存储过程?天,太复杂了!但我还是要简单地介绍一两点,为以后讨论层次数据作个铺垫吧!

  利用存储过程同时获取多个行集(rowset)的方法有两种。

  第一种方法,是“一个存储过程,多个输出行集”。例如,我们可以在前一个例子的基础上增加一个存储过程,将两条 select 语句包含进去:

CREATE PROCEDURE [dbo].[TitlesPerPublisher]
AS
Begin
SELECT Pub_Id, Title, Price FROM Titles
SELECT Pub_ID, Pub_Name FROM Publishers
End
  够简单吧!这段代码提交两个 select 语句,因而将返回两个行集。

  为了提高效率,我们可以借助 dataAdapter 的 Selectcommand 属性设置指令类型为

CommandType.StoredProcedure :

daHDAta = new SqlDataAdapter(sSQLCmd, cnstring)
dahData.SelectCommand.CommandType = CommandType.StoredProcedure
  因为这样可以指示 dataAdapter 使用效率较高的 t-sql 语句 Exec 执行存储过程。假如省略这一步,dataAdapter 就以低效的 sp_executesql 执行它了。

  第二种方法,是“两个存储过程,两个输出行集”。然而,此法造成数据往返传递,况且无论数据转输抑或 RPC 建立都是耗时过程,效率自然大打折扣。

  由此我们得出结论:争取用一个存储过程返回全部行集 。就本例而言,最简单的做法莫过于用一个新过程捆绑两个存储过程。此法或许不尽完美,但是别忘了,这是“最简单”的。

  至于如何在应用程序和 ADO.NET 中同时调用两个存储过程,由于篇幅有限,请自行参考有关 sqlCommand 对象的文章。

  关系

  为了处理现实中的层次数据,必须理清基本表之间的关系。借助 Dataset 的关系集合很轻易建立起关系。语法简洁明了,应该不成问题:


public void Add(DataRelation);
public virtual DataRelation Add(DataColumn, DataColumn);
public virtual DataRelation Add(DataColumn[], DataColumn[]);
public virtual DataRelation Add(string, DataColumn, DataColumn);
public virtual DataRelation Add(string, DataColumn[], DataColumn[]);
public virtual DataRelation Add(string, DataColumn, DataColumn, bool);
public virtual DataRelation Add(string, DataColumn[], DataColumn[], bool);
  为了建立关系,必须提供一个关系名字符串和至少两个列。假如关系已经存在,或者列有问题 (比如它们不存在),则运行环境将产生一个异常。详情请见 .NET 框架 SDK 。

  下列代码在现有的基本表之间新增了一个简单的关系:

dsTest.Relations.Add("PuBTitles",
dsTest.Tables["Publishers"].Columns["Pub_ID"],
dsTest.Tables["Titles"].Columns["Pub_ID"])
  此代码在名为 PubTitles 的关系集合中创建了一个 relation 对象和一个关系:Publishers.Pub_ID 是父表,而 Titles.Pub_id 是子表。

  显示数据

  为了选取子列,datarow 对象提供了一个 GetChildRows 方法,它的参数是关系名或许关系对象名:

public DataRow[] GetChildRows(DataRelation);
public DataRow[] GetChildRows(string);
public DataRow[] GetChildRows(DataRelation, DataRowVersion);
public DataRow[] GetChildRows(string, DataRowVersion);
  类似的方法还有 GetParentRow 和 GetParentRows 。它们根据子列返回父列的名字。

  现在有了 GetChildRows 方法,就向数据进军吧! GetChildRows 返回一个 DataRowCollection 对象,后者的父类 InternalDataCollectionBase 是对 ICollection 和 IEnumerable 的具体实现。

  接下来的循环处理只是举手之劳了。下列代码演示了显示数据关系的一种简单方法:

foreach(DataRow drPublisher in dtPublishers.Rows)
{
Console.WriteLine(drPublisher["Pub_Id"] + "\t" + drPublisher["Pub_Name"]);
Console.WriteLine("=====================");

foreach(DataRow drTitle in drPublisher.GetChildRows("PubTitles"))
{
Console.Write(drTitle["Title"] + "\t");
Console.Write((drTitle["price"].ToString() != null ? drTitle["price"] : "n/a"));
}
}
  当然,也可明确指定一个 relation 对象:

DataRelation drPubsTitles = dsHData.Relations.Add("PubTitles",
dtPublishers.Columns["Pub_ID"],
dsHData.Tables["Titles"].Columns["Pub_ID"]);
foreach(DataRow drPublisher in dtPublishers.Rows)
{
Console.WriteLine(drPublisher["Pub_Id"] + "\t" + drPublisher["Pub_Name"]);
Console.WriteLine("=====================");

foreach(DataRow drTitle in drPublisher.GetChildRows(drPubsTitles))
{
Console.Write(drTitle["Title"] + "\t");
Console.Write((drTitle["price"].ToString() != null ? drTitle["price"] : "n/a"));
}
}
  ADO.NET 能让程序员在数据表中创建自定义视图。这是由 DataView 类实现的:

public class DataView : MarshalByValueComponent, IBindingList,
IList, ICollection, IEnumerable, ITypedList, ISupportInitialize
  当然,限于篇幅,这里仅仅列举了部分函数。

  数据视图提供了两个有趣的属性:RowFilter 和 Sort 。RowFilter 与 ADO recordset 对象的 Filter 属性相似,它相当于与 SQL 语法中的 WHERE 语句,能够筛去匹配的列:


dtPublishers.DefaultView.RowFilter="Pub_ID < 2000";
  最终得到的列被置于 DataRowView 集合中,因此能用 for each 语句循环处理它们。

  Sort 属性用于指定输出数据的排序方式。它与 SQL 语法中的 ORDER BY 命令相似:

dtPublishers.DefaultView.Sort="PUB_ID Desc";
  每个基本表对应一个 DataView 对象,上述DefaultView 就是其属性。于是,只需做些小小的修改,我们就能有选择地循环显示数据了。

foreach(DataRow drPublisher in dtPublishers.Rows)
{
Console.WriteLine(drPublisher["Pub_Id"] + "\t" + drPublisher["Pub_Name"]);
Console.WriteLine("=====================");

foreach(DataRow drTitle in drPublisher.GetChildRows("PubTitles"))
{
Console.Write(drTitle["Title"] + "\t");
Console.Write((drTitle["price"].ToString() != null ? drTitle["price"] : "n/a"));
}
}
  结论

  ADO.NET 大大简化了层次数据的处理,并且提供了改良的方案。

  读过本文,是否跃跃欲试呢?若要追求更强的功能,恐怕还得另请高明了。

  本文没有考虑性能优化,因为我们讨论的 SDK 还是 beta 2 版。
上一篇:.NET正则表达式使用高级技巧之工作特点 人气:719
下一篇:质量功能配置(QFD)(1) 人气:390
浏览全部软件工程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成