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

有什么理由为什么

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

不使用OleDbAdapter.Fill(DataSet)OleDbCommand.ExecuteReader()返回任何logging?

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

  SELECT * FROM MyTable 

所有logging都会返回。

使用OLE DB时,将%更改为%因为%是通配符search。

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

尝试改变LIKEALIKE和从*%通配符。

Access数据库引擎(Jet,ACE,无论什么)有两个ANSI查询模式 ,每个使用LIKE不同通配符:

  • ANSI-89查询模式使用*

  • ANSI-92查询模式使用%

OLE DB始终使用ANSI-92查询模式。 DAO总是使用ANSI-89查询模式。 访问用户界面可以设置为使用一个或另一个。

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

考虑一个业务规则,指出一个数据元素必须包含八个数字字符。 说我执行这个规则如下:

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

我将使用%作为通配符是不可避免的,因为Access的CHAR数据types和CHECK约束只能在ANSI-92查询模式中创build。

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

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

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

在ANSI-89查询模式创build的validation规则中使用LIKE* ,以及使用总是使用ANSI-92查询模式的ADO进行连接的人,以及在*字符不应该是INSERT的*字符。

据我所知,没有办法强制使用ANSI查询模式访问Access数据库。 因此,我认为无论用户select什么ANSI查询模式,都应该对所有SQL进行编码以保持一致。

注意,使用上面的例子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将导致较less的冗长代码,即对于人类阅读器更容易,因此更容易维护。

另外,当需要移植到符合SQL标准的SQL产品时,也可以使用ALIKE端口,即将ALIKE关键字转换为LIKE 。 当parsing一个给定的SQL谓词时,find一个LIKE关键字要比在文本文字中查找所有*字符的多个实例要容易得多。 请记住,“便携式”并不意味着“代码将会运行”。 相反,这是在平台之间移动代码是多么容易的一种措施(并且要记住,在同一产品的版本之间移动是一个端口,例如Jet 4.0到ACE是一个端口,因为用户级安全性不再起作用, DECIMAL值sorting不同等)。

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

这应该排除这个问题。

Jeez,这个作品! 非常感谢。

我只是不得不把not like criteria not alike criteria

我分享我的“故事”,以帮助其他人更容易find这个职位,并保存两个小时的search。

虽然我已经将Excel 95-97 xls文件链接到Access 2010数据库,并运行create tableinsert into查询以将所有数据导入数据库,但出于某种奇怪的原因,select查询无法findstring“键入。

我尝试not like "something"not like "%something%"没有成功 – 根本没有工作。

大号