VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理

 

1.先说动态查询,目前已知有如下几种方法:

经过比较,我认为最后一种方法最简单方便,只须简单的在原来的SQL语句上稍加扩展即可达到目的。 


需要声明的是,这种写法是博客园里的edobnet网友提出的。

文章地址为http://www.cnblogs.com/edobnet/archive/2004/07/16/24781.html

 

但由于他的文章有很多人回复,比较乱,所以我特意把原文及回复做了一下归纳。

其中比较有特点的SQL写法有: 


-- 博客园网友edobnet的写法
SELECT   *   FROM   table   WHERE  (addDate  =   @addDate   OR   @addDate   IS   NULL AND  (name  =   @name   OR   @name   =   '' )

-- 博客园网友goodspeed的写法
SELECT   *   FROM   table   WHERE  (addDate  =   CASE   @addDate   IS   NULL   THEN  addDate  ELSE   @addDate   END AND  
    (name 
=   CASE   @name   WHEN   ''   THEN  name  ELSE   @name   END )

-- 网友Hanjoe的写法
SELECT   *   FROM   table   WHERE  addDate  =   ISNULL ( @addDate  ,addDate)  AND  name  =   ISNULL ( @name ,name) 

第三种写法最简洁,但是有缺点——对@name使用ISNULL,只考虑了@name为null的情况却没考虑@name是空字符串(@name='')时的情况。
要知道对于数据库来说空字符串('')和null并不是一回事。(关于null,更详细的介绍请参见《.NET和SQL Server中“空值”辨析 (DBNull与Null的区别)》一文)
 

总体来看,还是第一种写法相对简洁、完善一些。当然也可以把第一和第三种写法综合,看个人习惯了。
 

2.使用LIKE 

如果LIKE后面的条件包含变量,则直接连写会导致识别错误,如: 

LIKE   ' %@CategoryName% '

可见变量名被当成了文本。

正确的写法是: 

LIKE   ' % '   +   @CategoryName   +   ' % '

(可参考 何設定TableAdapter.FillBy條件使用LIKE” ) 

 

3.完整代码举例如下
 
SELECT  StationID, CompanyName, ContactName, Address, City, PostCode, Phone, 
      Fax
FROM  Stations
WHERE  (StationID  =   @StationID   OR   @StationID   =   '' AND  
      (CompanyName 
LIKE   ' % '   +   @CompanyName   +   ' % '   OR   @CompanyName = '' AND
      (ContactName 
LIKE   ' % '   +   @ContactName   +   ' % '   OR   @ContactName = '' )

 

 

你可能感兴趣的:(Adapter)