为什么Access中的LIKE查询不返回任何记录?

时间:2011-03-02 11:36:44

标签: sql ms-access oledbcommand

有什么理由

SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'

不会返回OleDbAdapter.Fill(DataSet)OleDbCommand.ExecuteReader()

的任何记录

当我直接在MS Access中运行相同的SQL时,它会返回预期的记录。此外,在相同的代码中,如果我将SQL更改为

 SELECT * FROM MyTable 

返回所有记录。

4 个答案:

答案 0 :(得分:29)

尝试将LIKE更改为ALIKE,将您的通配符从*更改为%

Access数据库引擎(Jet,ACE,无论如何)有两个ANSI Query Modes,每个{{3}}使用不同的通配符LIKE

  • ANSI-89查询模式使用*

  • ANSI-92查询模式使用%

OLE DB始终使用ANSI-92查询模式。 DAO始终使用ANSI-89查询模式。 可以将Access UI设置为使用其中一个。

但是,使用ALIKE关键字时,无论ANSI查询模式如何,通配符始终为%

考虑一个规则数据元素必须由八个数字字符组成的业务规则。假设我按如下方式实施了规则:

CREATE TABLE MyStuff 
(
 ID CHAR(8) NOT NULL, 
 CHECK (ID NOT LIKE '%[!0-9]%')
);

我不可避免地会使用%作为通配符,因为Access的CHAR数据类型和CHECK约束只能在ANSI-92查询模式下创建。

但是,有人可以使用DAO访问数据库,DAO总是使用ANS-89查询模式,%字符将被视为文字而不是“特殊”字符,并且可以执行以下代码:

INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');

插入将成功,我的数据完整性将被拍摄:(

在ANSI-89查询模式下创建的验证规则中使用LIKE*以及使用始终使用ANSI-92查询模式的ADO和INSERT连接的人可以说同样的情况一个*字符,其中*字符不应该是。

据我所知,没有办法强制使用哪种ANSI查询模式来访问一个人的Access数据库。因此,我认为所有SQL都应编码为一致,无论用户选择的ANSI查询模式如何。

请注意,使用LIKE和上述示例进行编码并不困难,例如

CHECK (
       ID NOT LIKE '%[!0-9]%'
       AND ID NOT LIKE '*[!0-9]*'
      )

......或者确实完全避免使用通配符,例如

CHECK (ID LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

然而,使用ALIKE将导致更简洁的代码,即人类阅读器更容易,因此更容易维护。

此外,当需要移植到符合SQL标准的SQL产品时,ALIKE端口也很好,即将ALIKE关键字转换为LIKE就是必需的。解析给定的SQL谓词时,找到一个LIKE关键字要比查找文本文字中*个字符的所有多个实例要容易得多。请记住,“便携式”并不意味着“代码将按原样运行”;相反,它衡量在平台之间移动代码是多么容易(并且要记住,在同一产品的版本之间移动是一个端口,例如Jet 4.0到ACE是一个端口,因为用户级别的安全性不再起作用,{{ 1}}值排序不同,等等。)

答案 1 :(得分:24)

*更改为%,因为%是使用OLE DB时的通配符搜索。

SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%' 

答案 2 :(得分:5)

尝试将通配符字符(*)转换为%

这应该排除问题。

答案 3 :(得分:0)

Jeez,这个有效! 非常感谢。

我只需将not like criteria替换为not alike criteria

我正在分享我的故事"帮助他人更轻松地找到这篇文章,并在两小时的搜索中保存它们。

虽然我已将Excel 95-97 xls文件链接到Access 2010数据库,但运行create tableinsert into查询将所有数据导入数据库,原因有些奇怪,选择查询无法找到我输入的字符串。

我尝试了not like "something"not like "%something%"但没有成功 - 只是没有成功。