正确利用 ADO.NET(2)
2008-04-02 10:46:29来源:互联网 阅读 ()
即使您已克服了单引号的问题,还是必须和 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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 正确配置和使用SQL mail
下一篇: 分区技巧
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

