有什么理由吗
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
不返回任何带有OleDbAdapter.Fill(DataSet)
or的记录OleDbCommand.ExecuteReader()
?
当我直接在 MS Access 中运行相同的 SQL 时,它会返回预期的记录。此外,在相同的代码中,如果我将 SQL 更改为
SELECT * FROM MyTable
返回所有记录。
有什么理由吗
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
不返回任何带有OleDbAdapter.Fill(DataSet)
or的记录OleDbCommand.ExecuteReader()
?
当我直接在 MS Access 中运行相同的 SQL 时,它会返回预期的记录。此外,在相同的代码中,如果我将 SQL 更改为
SELECT * FROM MyTable
返回所有记录。
尝试将LIKE
toALIKE
和您的通配符从*
to更改为%
。
Access 数据库引擎(Jet、ACE 等)有两种ANSI 查询模式,每种都使用不同的通配符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 访问数据库,它始终使用 ANS-89 查询模式,并且该%
字符将被视为文字而不是“特殊”字符,并且可以执行以下代码:
INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');
插入将成功,我的数据完整性将被拍摄:(
使用LIKE
和*
在 ANSI-89 查询模式中创建的验证规则和使用 ADO 连接的人也可以这样说,ADO 始终使用 ANSI-92 查询模式,并在不应该出现*
字符的地方插入字符。*
据我所知,没有办法强制使用哪种 ANSI 查询模式来访问一个人的 Access 数据库。因此,我认为无论用户选择何种 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
将导致代码不那么冗长,即更易于人类阅读,因此更易于维护。
此外,当需要移植到符合 SQL 标准的 SQL 产品时,也可以ALIKE
很好地移植,即只需将ALIKE
关键字转换LIKE
为。在解析给定的 SQL 谓词时,找到其中的一个关键字要比在文本文字LIKE
中找到该字符的所有多个实例要容易得多。*
请记住,“可移植”并不意味着“代码将按原样运行”;相反,它是衡量在平台之间移动代码的难易程度(请记住,在同一产品的版本之间移动是一个端口,例如 Jet 4.0 到 ACE 是一个端口,因为用户级安全不再起作用,DECIMAL
值排序不同,等等)。
使用 OLE DB 时将您的通配符搜索更改*
为%
原样。%
SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%'
尝试将通配符 (*) 转换为 %
这应该解决问题。
天哪,这行得通!非常感谢。
我只需要替换not like criteria
为not alike criteria
.
我正在分享我的“故事”,以帮助其他人更轻松地找到这篇文章,并将他们从两个小时的搜索中拯救出来。
尽管我已将 Excel 95-97 xls 文件链接到 Access 2010 数据库,并运行create table
查询insert into
以将所有数据导入数据库,但出于某种奇怪的原因,选择查询找不到我输入的字符串。
我尝试过not like "something"
但not like "%something%"
没有成功 - 根本没有用。
大号