有什么理由
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
不会返回OleDbAdapter.Fill(DataSet)
或OleDbCommand.ExecuteReader()
当我直接在MS Access中运行相同的SQL时,它会返回预期的记录。此外,在相同的代码中,如果我将SQL更改为
SELECT * FROM MyTable
返回所有记录。
答案 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 table
和insert into
查询将所有数据导入数据库,原因有些奇怪,选择查询无法找到我输入的字符串。
我尝试了not like "something"
和not like "%something%"
但没有成功 - 只是没有成功。
→