Access 2010问题与C#中的where子句

时间:2013-09-11 03:46:51

标签: c# sql ms-access ms-access-2010

我有一个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#中不起作用。

所以我现在很困惑

2 个答案:

答案 0 :(得分:3)

您正在使用OleDb连接到Access db文件。在这种情况下,您必须使用ANSI通配符(%_)进行Like比较,而不是*?

WHERE子句中使用这样的模式。

WHERE [Employee Name] LIKE "%Mark%"

如果您想在Access会话中使用与OleDb连接相同的查询,请使用ALIKE而不是LIKEALIKE始终使用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。

因此,将星号更改为百分号可解决问题。

再次感谢。