使用XmlReader迭代代替类型化DataSet和IDataReader解析关联数据

xml|数据

正在修改的第一个电子购物程序中需要处理购物订单和订单明细的读取/更新问题. 他们在数据库中分成两个表存储,Order和OrderDetails.现在要把他们的数据读取出来,并创建一个Order的数据实体供程序使用. 一开始的时候我考虑使用IDataReader读取数据,即打开两个数据库连接,一个用来读取Order,一个用来读取OrderDetails.后来感觉麻烦, 就开始考虑使用xml shema创建一个数据集,然后利用SqlServer的xml功能返回一个XmlReader,读取到这个类型化的DataSet中,但是因为涉及到DataSet,担心性能的影响,写了一个小程序来测试其性能.调试过程中,缺发现,最快的方式应该是自己使用XmlReader迭代返回的Xml 字符串.程序如下: 首先在SqlServer中使用for xml的Sql语句生成Xml: ALTER PROCEDURE Shop_GetOrders2 ( @BlogID bigint ) AS SELECT 1 as Tag, NULL as Parent, O.OrderID as [Order!1!OrderID], O.userid as [Order!1!userid], O.useremail as [Order!1!useremail], O.UserMobile as [Order!1!UserMobile], O.userim as [Order!1!userim], O.receipt as [Order!1!receipt], O.city as [Order!1!city], O.address as [Order!1!address], O.postcode as [Order!1!postcode], O.usertel as [Order!1!usertel], O.deliverymethod as [Order!1!deliverymethod], O.deliverfee as [Order!1!deliverfee], O.paymethod as [Order!1!paymethod], O.realname as [Order!1!realname], case O.vip when 1 then 'true' when 0 then 'false' end as [Order!1!vip], O.BlogID as [Order!1!BlogID], O.UserTitle as [Order!1!UserTitle], O.InsertDate as [Order!1!InsertDate], NULL as [Detail!2!ProductID], NULL as [Detail!2!UnitPrice], NULL as [Detail!2!UnitScore], NULL as [Detail!2!Number] FROM Orders O WHERE O.BlogID = @BlogID UNION ALL SELECT 2 as Tag, 1 as Parent, O.OrderID as [Order!1!OrderID], NULL as [Order!1!userid], NULL as [Order!1!useremail], NULL as [Order!1!UserMobile], NULL as [Order!1!userim], NULL as [Order!1!receipt], NULL as [Order!1!city], NULL as [Order!1!address], NULL as [Order!1!postcode], NULL as [Order!1!usertel], NULL as [Order!1!deliverymethod], NULL as [Order!1!deliverfee], NULL as [Order!1!paymethod], NULL as [Order!1!realname], NULL as [Order!1!vip], NULL as [Order!1!BlogID], NULL as [Order!1!UserTitle], NULL as [Order!1!InsertDate], OD.ProductID as [Detail!2!ProductID], OD.UnitPrice as [Detail!2!UnitPrice], OD.UnitScore as [Detail!2!UnitScore], OD.Number as [Detail!2!Number] FROM Orders O, OrderDetails OD WHERE O.OrderID = OD.OrderID and O.BlogID = @BlogID FOR XML EXPLICIT 下面的程序则解析内容: [STAThread] static void Main(string[] args) { for(int i=0;i<200;i++) { System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Run1)); thread.Start(); } done.Set(); Console.Read(); } public static System.Threading.ManualResetEvent done = new System.Threading.ManualResetEvent(false);//线程并发控制 public static void Run1() { done.WaitOne(); SqlConnection conn = new SqlConnection("uid=sa;pwd=sa;database=shop;server=chris"); try { SqlCommand comm = conn.CreateCommand(); comm.CommandText = "shop_getorders2"; comm.CommandType = CommandType.StoredProcedure; comm.Parameters.Add(new SqlParameter("@BlogID",1)); conn.Open(); System.Xml.XmlReader reader = comm.ExecuteXmlReader(); // OrdersData ds = new OrdersData(); Console.WriteLine(DateTime.Now.ToString() + "\t"); while(reader.Read()) { if(reader.NodeType==System.Xml.XmlNodeType.Element&&reader.LocalName=="Order") { reader.GetAttribute("OrderID"); reader.GetAttribute("userid"); Console.WriteLine(reader.GetAttribute("useremail")+"------------------------------------------------------------"); reader.GetAttribute("UserMobile"); reader.GetAttribute("userim"); reader.GetAttribute("receipt"); reader.GetAttribute("city"); reader.GetAttribute("address"); reader.GetAttribute("postcode"); reader.GetAttribute("usertel"); reader.GetAttribute("deliverymethod"); reader.GetAttribute("deliverfee"); reader.GetAttribute("paymethod"); reader.GetAttribute("vip"); reader.GetAttribute("BlogID"); reader.GetAttribute("InsertDate"); reader.GetAttribute("UserTitle"); while(reader.Read()) { if(reader.LocalName=="Order"&&reader.NodeType==System.Xml.XmlNodeType.EndElement) { break; } if(reader.NodeType==System.Xml.XmlNodeType.Element && reader.LocalName=="Detail") { reader.GetAttribute("ProductID"); Console.WriteLine(reader.GetAttribute("UnitPrice")); reader.GetAttribute("UnitScore"); reader.GetAttribute("Number"); } } } } } finally { conn.Close(); } } 这种方法在打开200个线程并发读取的时候,整整比用两个Connection读取数据快了1-2秒.比DataSet的ReadXml快了4秒之多

时间: 2024-09-21 05:06:20

使用XmlReader迭代代替类型化DataSet和IDataReader解析关联数据的相关文章

ADO.Net 类型化DataSet的简单介绍_实用技巧

一.弱类型DataSet的缺点:1.只能通过列名引用,dataset.Tables[0].Rows[0]["Age"],如果写错了列名编译时不会发现错误,因此开发时必须要记着列名.2.int age=Convert.ToInt32(dataset.Rows[0]["Age"]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错.3.将DataSet传递给其他使用者,使用者很难识别出有哪些列可以供使用.4.运行时才能知道所有列名,数

分页-PagedDataSource里面的集合数据怎么读取出来像dataset一样实现循环读取数据

问题描述 PagedDataSource里面的集合数据怎么读取出来像dataset一样实现循环读取数据 我之前用dataset获得了查询的列表数据 然后给PagedDataSource赋值 这个就是实现一个分页的 我想把PagedDataSource分页数据循环读取出来绑定到自己构建的HTML 解决方案 你不用读取出来,就可以直接绑定到前台的html代码中的. 后台代码为 rpt.DataSource=PagedDataSource.DataSource; rpt.DataBind(); htm

亲密接触ASP.Net(9) 在一个DataSet中储存多个数据表

在一个DataSet中储存多个数据表 我们在ASP中很多人习惯于使用RecordSet对象来操作数据库,但是RecordSet有一个的缺点就是一个RecordSet只能储存一个数据表,当我们需要操作多个表时,不得不在多个RecordSet中来回操作,虽然这些在使用习惯后也没有什么,但是对一个新手来说,这也是一个很麻烦人的事情.光是那些变量名就可以搞浑你,现在好了,在ASP.Net中,只需要一个DataSet就可以搞定一切.大大的方便了我们的程序.我们还是老样子,先看一段程序,再来细细讲解. <%

请问如何让DataSet中的一列数据在DataGridView显示时划分到几个不同的列中(根据另一列的数值)?

问题描述 Sql中列表为StuIDTestIDScoreStu1test160stu1test270stu2test180stu2test290想让它显示为StuIDTest1Test2stu16070stu28090想要dataGirdview与原始dataset保持绑定,好方便直接修改数据后更新请教如何实现,SQLdataView什么方法都好,使用其它控件也可以先谢过了 解决方案 解决方案二:自己顶下,在线求解解决方案三:直接在数据库生成那样的格式不是更好吗?1.建立一张表,记录stuid2

C#的IDataReader造成的资源泄漏

在ADO(+)数据访问的时候,MS曾经在其出版的书籍中强调过(有可靠证据),尽量不要使用使用DataSet访问对象,而是使用IDataReader这个只读的向前的记录集访问,的确,这是有一定的道理的,DataSet是把数据集先置于内存中,然后告诉缓存起来,断开连接,IDataReader是直接读取的. 在数据量较少的情况下,DataSet和IDataReader的优劣并没有非常明显的优劣,然而,当数据流量达到一定量(200条左右),这和您的计算机的硬件配置有关,IDataReader的优势就很明

c#中的DataSet深入探讨及RecordSet的比较

虽说ADO.NET是 ADO在.Net平台下得后继版本,但二者的区别是很大的.突出表现在ADO中的RecordSet对象和ADO.NET中的DataSet对象.RecordSet其实也是非常灵活的一个对象,微软公司推出它也是煞费苦心,如:RecordSet可以离线操作数据库教程,性能优良,效率较高等等这些都让当时的程序员为之一振.RecordSet虽然已经很复杂,但DataSet却比RecordSet复杂的多,我们知道每一DataSet往往是一个或多个DataTable 对象的集合,这些对象由数

DataSet DataTable DataReader DataAdapter详解

 public JsonResult Test()        {            JsonResult json = new JsonResult                                 {                                     Data = new                                                {                                          

使用 XML:完成 XI 实现 XMLReader 接口

xml 专栏作家 Benoit Marchal 继续描述 XI,它是一个将旧文本转换成 XML 的开放源码项目.为了提高效率,XI 现在实现了 SAX XMLReader 接口,这证明了该接口使 XI 链接到 XSLT 处理器变得容易.代码样本演示了这些技术,还可以获得完整的源代码.专栏每个月都报告作者旨在帮助志同道合的 XML 开发人员(尤其是那些使用 Java 技术的开发人员)的开放源码项目.在上两篇专栏文章中,我一直在讨论 XI(XML Import 的缩写),它是一个将旧文件转换成 XM

使用DataReader、DataSet、DataAdapter和DataView

使用DataReader.DataSet.DataAdapter和DataView ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader.DataSet提供内存中关系数据的表现--包括表和次序.约束等表间的关系的完整数据集合.DataReader提供快速.只向前.只读的来自数据库的数据流. 使用DataSet时,一般使用DataAdapter(也可能是CommandBuilder)与数据源交互,用DataView对DataSet中的数据进行排