当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 使用XmlReader迭代代替类型化DataSet和IDataReader解析关联数据

ASP.NET
.NET框架类库中的定时器类的使用
net得到本地电脑基本信息的简单方法
如何通过ASP.NET页面重启服务器
.net开发工具LINQ框架设计指南
.net ajax 与Ext2框架在.net程序中的应用
.Net上传图片按比例自动缩小或放大
.NET的死锁调试工具:ACorns.Debugging
ADO在vb.net中的使用(与datagrid结合)
Visual C++中实现双缓冲的基本原理
.net App中集成COM组件的一些简单技巧
vb.net通过app.config来改变编译路径
实例了解Asp.Net的继承和多态性
asp.net里导出excel表方法汇总
ASP.NET上传大于4M的文件的相关设置
.Net开发漫谈:关于命名空间和目录划分
.Net(C#)开发漫谈:关于变量的命名和属性
.Net新手学堂:Lambda表达式的一般应用
故障解析:.NET开发正则表达式中BUG一例
一步一步安装VB.Net(图片较多,请稍等)
关于用VB做更漂亮的窗体的思考

ASP.NET 中的 使用XmlReader迭代代替类型化DataSet和IDataReader解析关联数据


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 91 ::
收藏到网摘: n/a

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