惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Vercel News
Vercel News
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
H
Help Net Security
罗磊的独立博客
The Cloudflare Blog
J
Java Code Geeks
博客园 - 叶小钗
I
InfoQ
B
Blog
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
月光博客
月光博客
博客园_首页
雷峰网
雷峰网
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
美团技术团队
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美

博客园 - 青弦

WinForm打印之页边距 [转载]交换的概念和原理 [转载]交换机概述 [转载]笑傲江湖之三层交换篇 [转载]Window.Open()网页弹出窗口大全 [转载]详解HTML中的META标签 [转载]网页滚动条特效 [转载]如何在MDI中使子窗体只保留一个实例(反射方法) 去除MDI子窗体最大化后在MainMenuStrip上自动产生的最大化等按钮 第一次认真画用例图,错误很多,请大家来指点 代码段,你用了吗? DIV的水平、垂直居中的最佳实现 Excel数字、文本混合列导入SQL Server出现的问题&解决办法 SQL Server 2000导入数据时遇到的问题 不逐流俗,独辟蹊径——另类又好用的软件推荐[不断更新……] Winform中全屏显示问题 [资源]在线工具测试网页载入速度 博客园blog模板CSS自定义美化 达摩克利斯之刃——.NET破解技术初探
VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理
青弦 · 2008-08-27 · via 博客园 - 青弦

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 NULLAND (name = @name OR @name = '')--博客园网友goodspeed的写法
SELECT * FROM table WHERE (addDate = CASE @addDate IS NULL THEN addDate ELSE @addDate ENDAND 
    (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='')