为什么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%'
尝试改变LIKE
到ALIKE
和从*
到%
通配符。
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 table
并insert into
查询以将所有数据导入数据库,但出于某种奇怪的原因,select查询无法findstring“键入。
我尝试not like "something"
而not like "%something%"
没有成功 – 根本没有工作。
大号