我有一个Access 2010数据库的复杂select
语句,它使用多个LEFT JOIN
语句从多个表中获取数据。查询按预期工作,我得到整个表。
所以现在我想添加搜索功能。
一种方法是在查询结尾添加WHERE
子句,并引用JOIN
ed表的文本字段之一,并将其与某些文本(WHERE [All Names].Name LIKE "*Mark*"
)进行比较。
我尝试的第二个选项是select * from (**complex sql here**) where **condition**
现在在这两种情况下,当我的条件像([ID]<15)
一样简单时,它就像一个魅力,但当我将其更改为([Employee Name] LIKE "\*Mark\*")
或选项1中的那个时,它会生成一个空数据表就好像请求通过,没有错误或异常,所有字段名都存在,但没有返回任何行。
但是,如果我使用调试器获取生成的SQL字符串的完整字符串(任一选项)(或者只是将其转储到文本文件中),然后实际上没有任何更改将该字符串直接放入新的Access查询中,它工作正常并返回名称包含“Mark”的几个字段
非常简单地说,在Access中工作正常的查询在C#中不起作用。
所以我现在很困惑
答案 0 :(得分:3)
您正在使用OleDb连接到Access db文件。在这种情况下,您必须使用ANSI通配符(%
和_
)进行Like
比较,而不是*
和?
。
在WHERE
子句中使用这样的模式。
WHERE [Employee Name] LIKE "%Mark%"
如果您想在Access会话中使用与OleDb连接相同的查询,请使用ALIKE
而不是LIKE
。 ALIKE
始终使用ANSI通配符。
WHERE [Employee Name] ALIKE "%Mark%"
答案 1 :(得分:1)
Simon的问题和HansUp的回答最终解决了我的问题。 对于那些好奇或有类似问题的人,这里是完整的查询:
string query=
"SELECT Employees.ID, " +
"[All Names E].Name AS [Employee Name], " +
"Titles.Title, " +
"[All Names S].Name AS [Supervisor Name], " +
"Employees.[Phone #], " +
"Offices.[Office Location], " +
"PCs.PC " +
"FROM (((((Employees LEFT JOIN [All Names] as [All Names E] ON Employees.Employee = [All Names E].ID) " +
"LEFT JOIN [All Names] as [All Names S] on Employees.Supervisor=[All Names S].ID) " +
"LEFT JOIN Titles on Employees.Title=Titles.ID) " +
"LEFT JOIN Offices on Employees.[Office Location]=Offices.ID) " +
"LEFT JOIN PCs on Employees.PC=PCs.ID) " +
"ORDER BY Employees.ID";
在ORDER BY
WHERE ([All Names E].Name LIKE \"*Mark*\")
之前添加where子句确实可以在Access中使用。
第二种方式是:
string searchQuery="select * from ("+query+") where ([Employee Name] like \"*Mark*\")";
两种方法在Access中都运行良好,但我不知道有一个不同的通配符符号可用于OleDB。
因此,将星号更改为百分号可解决问题。
再次感谢。