正确利用 ADO.NET
即使您已克服了单引号的问题,还是必须和 varchar 变量的 8000 字符的限制作斗争。假如动态 SQL 字符串的长度超过 8000 个字符,查询就会崩溃。您可能认为 8000 个字符的长度对于您所要生成的任何查询都是足够的,但根据列数和每个 CASE 表达式的字符长度,最终的 SQL 字符串可能会变得很长。在我们的示例中,只要有大约 100 列,查询就会崩溃。您能够通过编程方式限制列数,这样查询就不会崩溃,但假如您需要超出这个限制,就没有办法了。chi na it p owe r .com5FLyL1t
克服此限制的一个方法是利用 ADO.NET 的关系特性。下面的示例生成一个宽度可变的交叉表报表,该报表能够根据您的需要包括任意数量的列,而且无需使用 SQL 游标、动态 SQL 或 CASE 表达式。chi na it p owe r .com5FLyL1t
清单 5(第 24 页)显示了此示例的 Visual Basic .NET 代码,该代码描述的是个名为 XTabDotNetDS 的类。请注意,标注 A 中的 Inherits DataSet 语句在类的开头。假如您不熟悉 ADO.NET,则能够将数据集理解为一个小型的内存中数据库。DataSet 对象有一个 Tables 集合。ADO.NET 表被称为数据表。每个数据表有一个 Rows 集合,他包含 DataRow 对象和 Columns 集合,Columns 集合包含 DataColumn 对象。DataSet 对象还具备包含 DataRelation 对象的 Relations 集合,DataRelation 对象描述了数据表之间的引用关系。Inherits DataSet 语句确保自定义 DataSet 类的开头是 ADO.NET DataSet 基类的任何集合和功能。创建 XTabDotNetDS 对象时,该类的构造函数调用三个过程:Get3Tables()、AddXTabTable() 和 FillXTabTable()。chi na it p owe r .com5FLyL1t
Get3Tables()。 清单 5 中的标注 B 显示的 Get3Tables() 过程说明使用 SqlDataAdapter 对象向数据集填充从清单 6(第 24 页)创建的存储过程返回的记录的操作。.NET 中的 SqlDataAdapter 对象可用作 SQL Server 数据源和 DataSet 对象之间的桥梁。清单 6 创建的存储过程返回三个源表。当 SqlDataAdapter 从 SQL Server 将多个表调入新创建的数据集时,ADO.NET 将为新的数据表分配一般名称 Table、Table1 和 Table2 等等。此时最好将这些表重命名为比较有意义的名称,这样您在使用这些表时就不必引用索引或一般名称了。我选择使用 Stores、Authors 和 Sales 作为表名。请注意,使用 SqlDataAdapter 时,您无需编写显式打开和关闭 SQL 连接对象的代码;SqlDataAdapter 会在后台为您完成这些工作。添加表后,代码将在 au_name 列上创建 Authors 表和 Sales 表之间的数据关系。最后,代码将在整个 Authors 表中进行迭代,以创建交叉表报表的行标头。对于每个 Author 行标头,代码使用这个 DataRelation 对象来查找销售额数据,以便填充交叉表中该作者的数据行中的其余各列。chi na it p owe r .com5FLyL1t
AddXTabTable()。 标注 C 中的 AddXTabTable() 过程将第四个数据表 XTab 添加到 Tables 集合。此表将保存最终交叉表报表。添加该数据表后,代码会通过向数据表的 Columns 集合添加列来创建数据表的架构。XTab 中的第一列 Column(0) 用于行标头,行标头将包含 Author 姓名。其他列名是来自 Stores 数据表的书店名称。要获得书店名称,您能够创建 DataView。chi na it p owe r .com5FLyL1t
DataView 构造函数接受 Stores 数据表作为其参数。DataView 是环绕 DataTable 对象的包装。代码通过 DataView 仍然能够访问数据表的任何属性,但 DataView 还增加了一些独一无二的重要方法。在此示例中,DataView.Sort 需要完成的任务是将书店按字母顺序排序。当代码在 DataView 中对书店进行排序后,代码会对任何行进行循环,并为每个书店向 XTab 数据表追加一列。Store(0), Barnum's, 成为 Column(1) 的列名。请注意,该代码将新列的数据类型配置为 System.Single 以接受货币数据,并将默认值配置为 0。chi na it p owe r .com5FLyL1t
FillXTabTable()。 剩下的工作是,通过使用标注 D 中的代码显示的 FillXTabTable() 过程来用数据填充 XTab 数据表。该过程首先对对象变量求值,然后对 Authors 表中的任何行进行循环。对于 Authors 表中的每一行,该代码为 XTab 数据表创建一个新的数据行,然后将作者的姓名放在第一列 — Column(0)。默认情况下,新行中其他列的内容为零。chi na it p owe r .com5FLyL1t
接下来,该代码对 DataRelation 对象调用 Author DataRow 的 GetChildRows 方法,以便从 Sales 表检索一个链接到该作者的 DataRow 的数组。对于该作者有销售额的每个书店,该数组 (arowSales) 包含有关该书店的一个数据行。例如,对于作者 Sheryl Hunter(该作者只在 Barnum's 书店有销售额),GetChildRows 返回一个只具备一个元素的数组。chi na it p owe r .com5FLyL1t
然后,该代码对该作者的销售额数据行进行循环,并将每个销售额总和放于在该销售额数据行的 stor_name 字段中标识的 XTab 列下。该作者没有销售额的书店的默认值仍然是 0。当 XTab 行完成后,该代码将他添加到数据表的 Rows 集合,然后返回到循环的开头,以便处理下一个作者。当处理完任何作者后,也就完成了 XTab 数据表,如图 3 所示。chi na it p owe r .com5FLyL1t
要在 .NET Windows 窗体 DataGrid 中查看结果,能够将 XTab 数据表分配给 DataGrid 的数据源。假如您希望在 DataGrid 第一次出现时对其进行排序,则能够使用清单 7 显示的代码将该表封装在 DataView 中,对 DataView 排序,然后将 DataView 分配给 DataGrid 的数据源。chi na it p owe r .com5FLyL1t
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
- SQL Server不存在或访问被
- SQL Server 2000数据库升
- SQL Server的Inner Join及
- SQL Server备份文件中导入
- SQL SERVER应用问题解答13
- SQL Server不能启动的常见
- 删除数据库中重复数据的几
- 如何快速生成100万不重复
- 探讨SQL Server 2005的评
- SELECT 赋值与ORDER BY冲
- 怎样用SQL 2000 生成XML
- 探讨SQL Server中Case 的
- MySQL的数据类型和建库策
- SQL Server各种日期计算方
- SQL Server各种日期计算方
- SQL Server 中易混淆的数
- 快速清除SQLServer日志的
- SQL Server导出导入数据方
- SQL Server数据库中处理空
- sql2k中新增加的Function
- 黑客经验谈 MSSQL SA权限
- 深入浅出SQL教程之嵌套SEL
- 用JavaBean编写SQL Server
- Mssql处理孤立用户的存储
- Sql Server中的日期与时间
- 无法在 SQL Server 2005 M
- 精华:精妙SQL语句
- SQL Server查询语句的使用
- 解读SQL Server2008的新语
- 如何使用SQL Server数据库
- 确定几个SQL Server栏中的
- 巧用一条SQL语句实现其它
- 四个语句帮你提高 SQL Ser
- SQL SERVER应用问题解答13
- MS SQL SERVER 的一些有用
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD



