24

有什么理由吗

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

不返回任何带有OleDbAdapter.Fill(DataSet)or的记录OleDbCommand.ExecuteReader()

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

 SELECT * FROM MyTable 

返回所有记录。

4

4 回答 4

33

尝试将LIKEtoALIKE和您的通配符从*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值排序不同,等等)。

于 2011-03-02T16:11:08.650 回答
27

使用 OLE DB 时将您的通配符搜索更改*%原样。%

SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%' 
于 2011-03-02T11:38:24.847 回答
5

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

这应该解决问题。

于 2011-03-02T11:40:40.513 回答
0

天哪,这行得通!非常感谢。

我只需要替换not like criterianot alike criteria.

我正在分享我的“故事”,以帮助其他人更轻松地找到这篇文章,并将他们从两个小时的搜索中拯救出来。

尽管我已将 Excel 95-97 xls 文件链接到 Access 2010 数据库,并运行create table查询insert into以将所有数据导入数据库,但出于某种奇怪的原因,选择查询找不到我输入的字符串。

我尝试过not like "something"not like "%something%"没有成功 - 根本没有用。

大号

于 2013-12-10T10:37:45.370 回答