正确利用 ADO.NET(3)

2008-04-02 10:46:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

两种方法间的差异chi na it p owe r .com5FLyL1t

上面讨论的两种创建动态交叉表报表的方法产生的结果很类似,但又不完全相同。ADO.NET 版本的方法在 Authors 表中针对每个作者包括一行,而动态 SQL 版本的方法则不包括在任何书店中均没有销售额的作者。根据报表的用途,这种不同会显得很重要。ADO.NET 版本的方法通过代码为您提供了排除在 Sales 表中没有子记录的作者的灵活性。一种方式是,只检查 Author DataRow 的 GetChildRows 方法返回的行数。假如不存在销售额记录,该代码就不向交叉表数据表添加新行。相反,使 SQL 交叉表查询返回没有销售额的作者的行则更加困难,但这是能够做到的。为了在动态 SQL 版本的方法中包括任何作者,您可能会决定首先至少将一个虚销售额记录添加到源数据,对于每个没有销售额的作者记录,虚销售额记录的销售额值为 0。但是,假如您使用 COUNT() 作为汇总函数,则此方法不起作用,因为那些虚销售额也会被计数,而这正是您所不希望的。解决此问题的办法是,通过使用您需要的汇总函数对源数据进行预聚合,然后添加虚记录,只要每个作者至少获得一个记录。之后,在交叉表查询中,始终使用 SUM() 函数。清单 8 显示的代码创建函数 dbo.fn_Sales(),该函数将来自 vwSales 的预聚合的记录和一组虚记录联合起来 — 每个组合都是针对相应的作者—书店对的,该组合是使用交叉联接生成的。假如您用 dbo.fn_Sales() 替换清单 4 的交叉表查询中的 dbo.vwSales2,则最终结果和 ADO.NET 版本的方法的结果相同:任何作者都出现在报表中。chi na it p owe r .com5FLyL1t

动态 SQL 方法的一个长处是他无需 Microsoft .NET 框架。例如,假如您使用 Visual Studio 6.0,则能够很轻松地从动态 SQL 交叉表创建 ADO 记录集,并将他绑定到 flex-grid 控件。另一方面,ADO.NET 方法不一定要绑定到 SQL Server。您能够很轻松地修改这种方法,使他能够用于不支持 CASE 表达式的数据库,例如,Microsoft Access。chi na it p owe r .com5FLyL1t

SQL Server 中游标的运行速度很慢,而且又要占用很多资源,因此,只有在其他方法都不可行的时候,才使用这种方案。动态 SQL 的效率也比较低,因为 SQL Server 不重用他从直接执行的 SQL 字符串生成的查询计划。执行 SQL 字符串时,还需要考虑安全问题。我尽可能避免使用游标和动态 SQL,ADO.NET 解决方案使我能够做到这一点。当我使用 ADO.NET 时,我不担心 varchar 变量的 8000 字符限制,相比前面提到的 T-SQL,我能够更好地控制输出。因此,只要我在 .NET 框架下工作,我就会使用 ADO.NET 解决方案。chi na it p owe r .com5FLyL1t


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 正确配置和使用SQL mail

下一篇: 分区技巧