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

2016-01-29 12:39 1 1 收藏

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

【 tulaoshi.com - ASP.NET 】

正在修改的第一个电子购物程序中需要处理购物订单和订单明细的读取/更新问题.他们在数据库中分成两个表存储,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.

来源:https://www.tulaoshi.com/n/20160129/1487040.html

延伸阅读
一、数字类型。数字类型按照我的分类方法分为三类:整数类、小数类和数字类。 我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们是同一种类型。它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的;他的值的每一位(包括小数点)占一个字节的存储空间,因此这种类型耗费空间比较大。但是它的一个突出的优点是小数的位数...
VB中没有提供定义数组并同时初始化其内容的方法,所以大多数情况下,必须单独地设置每一个元素,就象下面一样: DimstrArray(0To3)AsString strArray(0)="Spring" strArray(1)="Summer" strArray(2)="Fall" strArray(3)="Winter" 在VB4、VB5和VB6中,可以使用Array()函数随意创建一个Variants类型数组: DimvarArray()AsVariant varA...
标签: 剪纸 民间工艺
出神入化,剪纸艺术代代传承 端坐在小小的摊位上,58岁的邓美生手握细长的剪刀,刀随纸不停旋转,不到3分钟,一只漂亮的凤凰便在他手中展翅欲飞。 邓美生是上海人,14岁到安徽黄山插队落户,30年的乡间生活,练就了他一手剪纸绝活。回城后,他在豫园摆起了小摊,每天要剪纸近12个小时。十几年下来,剪纸的材料从普通纸变成了色...
1. 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null; 3. String str="kvill"; String str=new String ("kvill");的区别: 在这里,我们不谈...
标签: Web开发
前台代码:html %@ Page language="c#" Codebehind="CodeUse.aspx.cs" AutoEventWireup="false" Inherits="DsAndXML.CodeUse" % !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" HTML     HEAD         titleCodeUse/title    ...

经验教程

544

收藏

77
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部