有没有任何理由为什么
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
OleDbAdapter.Fill(DataSet)
或OleDbCommand.ExecuteReader()
运行时为什么没有返回任何记录?
当我直接在MS Access中运行相同的SQL语句时,它会返回期望的记录。而且,在相同的代码中,如果我将SQL语句更改为
SELECT * FROM MyTable
返回所有记录。
有没有任何理由为什么
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
OleDbAdapter.Fill(DataSet)
或OleDbCommand.ExecuteReader()
运行时为什么没有返回任何记录?
当我直接在MS Access中运行相同的SQL语句时,它会返回期望的记录。而且,在相同的代码中,如果我将SQL语句更改为
SELECT * FROM MyTable
返回所有记录。
LIKE
改为 ALIKE
,并将通配符字符从 *
改为 %
。LIKE
:
ANSI-89 查询模式使用 *
ANSI-92 查询模式使用 %
ALIKE
关键字时,通配符字符始终为 %
,无论使用哪种 ANSI 查询模式。CREATE TABLE MyStuff
(
ID CHAR(8) NOT NULL,
CHECK (ID NOT LIKE '%[!0-9]%')
);
INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');
LIKE
和 *
字符来解决。当使用 ADO 连接时,ADO 总是使用 ANSI-92 查询模式,如果用户在不应该使用 *
字符的地方插入了 *
字符,那么就会出现相同的问题。”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
会导致代码更简洁,即对于人类读者来说更容易理解,因此更易于维护。ALIKE
也可以很好地移植,即只需将ALIKE
关键字转换为LIKE
。在解析给定的SQL谓词时,要比在文本字面值中找到多个*
字符的所有实例要容易得多。请记住,“可移植”并不意味着“代码将运行‘as is’”,而是衡量在各个平台之间移动代码的难易程度(请谨记,在同一产品的不同版本之间移动也是一种移植,例如从Jet 4.0到ACE的移植,因为用户级安全性不再起作用,DECIMAL
值排序方式不同等)。ALIKE
转换为LIKE
比将*
转换为%
容易得多 - 考虑到您可能正在解析连接的字符串,处理*
,CHR(42)
和CHR $(42)
,而且*
字符或42
ASCII代码可能存储在表中!但与ANSI查询模式中立性相比,这只是一个小问题。 - onedaywhen将您的*
更改为%
,因为在使用OLE DB时%
是通配符搜索。
SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%'
*
是正确的,尽管在其他情况下%
是正确的。我的Access 2010数据库更喜欢使用*
。请参见下面@onedaywhen的答案。 - CodeMed尝试将通配符字符(*)转换为%
这应该解决问题。
哎呀,这个方法可行!非常感谢。
我只需要将not like criteria
替换为not alike criteria
。
我分享我的“故事”,以帮助其他人更容易地找到这篇文章,并节省他们两个小时的搜索时间。
尽管我已经将Excel 95-97 xls文件链接到Access 2010数据库,并运行了create table
和insert into
查询来将所有数据导入数据库,但由于某种奇怪的原因,选择查询无法找到我输入的字符串。
我尝试了not like "something"
和not like "%something%"
,但都没有成功 - 根本不起作用。
L