Sql 为什么Access中的LIKE查询不返回任何记录?

Sql 为什么Access中的LIKE查询不返回任何记录?,sql,ms-access,oledbcommand,Sql,Ms Access,Oledbcommand,有什么原因吗 SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*' 不返回任何带有OleDbAdapter.Fill(数据集)或OleDbCommand.ExecuteReader()的记录。 当我在MS Access中直接运行相同的SQL时,它将返回预期的记录。同样,在相同的代码中,如果我将SQL更改为 SELECT * FROM MyTable 将返回所有记录。将*更改为%,因为%是使用OLE DB时的通配符搜索 SELECT * FRO

有什么原因吗

SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
不返回任何带有
OleDbAdapter.Fill(数据集)
OleDbCommand.ExecuteReader()的记录。

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

 SELECT * FROM MyTable 

将返回所有记录。

*
更改为
%
,因为
%
是使用OLE DB时的通配符搜索

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

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


这将解决问题。

尝试将
LIKE
更改为
LIKE
,并将通配符从
*
更改为
%

Access数据库引擎(Jet、ACE等)有两个引擎,每个引擎都使用不同的通配符作为
之类的

  • ANSI-89查询模式使用
    *

  • ANSI-92查询模式使用
    %

OLE DB始终使用ANSI-92查询模式。 DAO始终使用ANSI-89查询模式。 可以将Access UI设置为使用其中一个

但是,当使用
like
关键字时,无论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查询模式下创建的验证规则中使用
*
,以及使用ADO(始终使用ANSI-92查询模式)进行连接的人,并在不应使用
*
字符的位置插入
*
字符,也可以做到这一点

据我所知,没有办法强制使用哪种ANSI查询模式来访问access数据库。因此,我认为,无论用户选择何种ANSI查询模式,所有SQL都应该编码为行为一致

注意:在上面的示例中,使用
类似的
对两者进行编码并不太困难,例如:

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]')
但是,使用类似的
将减少代码的冗长程度,即对人类读者来说更容易,因此更容易维护

此外,当需要移植到符合SQL标准的SQL产品时,
LIKE
也能很好地移植,即将
LIKE
关键字转换为
LIKE
是所需的全部。在解析给定的SQL谓词时,在中查找一个
LIKE
关键字要比查找所有关键字容易得多文本文本中的
*
字符的多个实例。请记住,“可移植”并不意味着“代码将按原样运行”,而是衡量在平台之间移动代码的容易程度(请记住,在同一产品的不同版本之间移动是一个端口,例如Jet 4.0到ACE是一个端口,因为用户级安全不再起作用,
十进制值排序不同,等等)。

天啊,这很有效! 非常感谢

我只需将
不相似标准
替换为
不相似标准

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

虽然我已经将Excel 95-97 xls文件链接到Access 2010数据库,并运行了
创建表
插入到
查询以将所有数据导入数据库,但出于某种奇怪的原因,select查询找不到我键入的字符串

我尝试了
不喜欢“某物”
不喜欢“%某物%”
,但没有成功-根本不起作用


L

我假设
LIKE
ANSI LIKE
的缩写。我不认为它有任何用处,除非是外国人可以访问。这意味着你最终会编写不可移植的SQL,但实际上,重要的是你的数据接口方法。如果你是来自外部访问的难民,下意识地必须使用%作为通配符,那么你就可以必须做的是确保您始终使用使用ANSI 92模式的数据访问方法。这将产生可移植的SQL,并且不会出现像
相似的
这样的专有乱码。实际上,如果您要使用相似的方法,您最好只使用*——两者都是不可移植的。@David-W-Fenton:“您所要做的就是确保始终使用使用ANSI 92模式的数据访问方法"--相反,我们必须确保所有用户只使用ANSI-92查询模式,但如何做到这一点?据我所知,这是不可能的。因此,您需要处理这两种ANSI查询模式,或使您的客户机暴露于数据完整性问题。此外,
类似的
具有很高的可移植性,比使用
类似的
+
*。我已经相应地更新了我的答案。其他数据库引擎支持相似吗?我不知道——我以为它是特定于Jet/ACE的。仅通过谷歌搜索一分钟,我没有发现任何证据表明任何其他数据库引擎支持相似。@David-W-Fenton:“如果您正在构建一个应用程序,您已经完全控制了它……现在,这对从DAO访问该数据库没有任何影响……我不知道ODBC支持它。。。“--你已经为我指出了一点:你对SQL代码将在其中执行的ANSI查询模式没有任何控制权!如果你这么认为,那你是在开玩笑:)@David-W-Fenton:不,我的意思是将
相似的
转换为
相似的
比将
*
转换为
%容易得多