快速业务通道

ASP.NET 2.0数据教程之四十八:在SqlDataSource中使用参数化查询

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
或MaxPrice TextBox缺少一个值的时候,GridView中将不会显示任何 内容。

ASP.NET 2.0数据教程之四十八:在SqlDataSource中使用参数化查询

图六:当MaxPrice TextBox 是空的时,没有任何记录被显示出来

没有显示任何产品记录的原因是,默认情况下,参数值的空字符串将被转 换为数据库NULL值。由于[UnitPrice] <= NULL永远为False,所以就不会返回 任何记录了。

在TextBox中输入一个值,比如5.00,然后点击 “Display Matching Products”按钮。通过回发,SqlDataSource告 诉GridView它有一个参数来源发生了变化。因此,GridView重新绑定 SqlDataSource,并把那些单价小于等于5美刀的产品显示出来。

ASP.NET 2.0数据教程之四十八:在SqlDataSource中使用参数化查询

图七:单价小于等于5美刀的产品被显示出来了

初始时显示所有 产品

当页面第一次加载时,我们可能希望显示所有产品而不是啥也不显示 。当MaxPrice TextBox是空的的时候,要显示所有的产品,一个办法就是将这个 参数的值设得超级无敌大,比如1000000,因为Northwind不太可能有哪个产品的 单价是超过1000000美刀的。不过,这个办法显然是有些目光短浅的,在某些情况 下可能根本就不奏效。

在前面的教程中(声明参数以及使用DropDownList 过滤的主/从报表),我们也面对了这样一个相似的问题。那时我们的办法就是把 这样的逻辑放到业务逻辑层中。实际上,BLL检查了输入的值,如果是NULL或别的 什么预先定义好的保留值,调用将被路由到返回所有记录的DAL方法。如果输入的 值是一个普通的过滤值,则使用这个值去调用可执行带有参数化WHERE子句的SQL 语句的DAL方法。

不幸的是,在使用SqlDataSource的时候我们绕过了这个 架构。所以,我们需要自定义SQL语句,以便在@MaximumPrice参数值为NULL或某 个保留值的时候可以获取到所有记录。为了做这么一个练习,我们就让 @MaximumPrice参数值为-1.0的时候返回所有记录(这里,-1.0就是一个保留值, 因为没有哪个产品的单价会是负数)。我们可以使用下面的SQL语句来达到这个目 的:

1SELECT ProductName, UnitPrice
2FROM Products
3WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = - 1.0

这个WHERE子句在@MaximumPrice参数值为-1.0时将返回所有记 录。如果参数值不是-1.0,则只有那些单价小于等于@MaximumPrice参数值的产品 才会被返回。通过将@MaximumPrice参数的默认值设置为-1.0,在页面第一次加载 时(或当MaxPrice TextBox没有内容时),@MaximumPrice将使用-1.0,这样所有 的记录就会被返回了。

ASP.NET 2.0数据教程之四十八:在SqlDataSource中使用参数化查询

图八:现在,当MaxPrice TextBox里面什么也没有的时候将会显示所有 产品

使用这个方法我们需要注意两个问题。第一,我们要知道,参数的数 据类型是通过它在SQL语句中的作用来进行推断的。如果你把 “@MaximumPrice = -1.0”改成“@MaximumPrice = -1” ,运行时将把参数当作整型来对待。这时如果你试图在MaxPrice TextBox中输入 一个小数(比如“5.00”),这时将会引发一个错误,因为它不能将 “5.00”转换成整型。要修正这个问题,你可以确认在WHERE子句中的 确使用的是“@MaximumPrice = -1.0”,也可以将ControlParameter 对象的Type属性设置为“Decimal”(后者也许更好一些)。

第二,由于在WHERE子句中加入了“OR @MaximumPrice = -1.0”,所 以查询引擎将无法使用UnitPrice上的索引(我们就假装那里有一个索引吧^_^), 这样将引发一个全表扫描(译者注:就是Table Scan)。如果Products表中有很 多记录的话,这会明显的影响到性能。更好的解决办法是,把这个逻辑放到存储 过程中,使用一个IF语句,在需要返回所有记录的时候,就使用一个不带WHERE子 句的SELECT语句,需要过滤的时候,就使用一个仅带有UnitPrice约束的WHERE子 句,这样就可以用上索

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号