2011-03-08 64 views
1

我目前正在连接并使用MS Access数据库。我可以做一个通用选择*查询罚款,所以我连接到数据库,但是当我尝试选择使用参数它会引发一个缺少的操作员异常。C#OleDb选择查询抛出缺少运算符异常

string selectStatement = "Select ID from pages where page_title = ? limit 1"; 
string title = Request.QueryString["pagetitle"]; 

OleDbCommand selectCommand = new OleDbCommand(selectStatement, conn); 
selectCommand.Parameters.Add("@p1",OleDbType.VarChar); 
selectCommand.Parameters["@p1"].Value = System.Web.HttpUtility.UrlDecode(title); 
OleDbDataReader selectResult = selectCommand.ExecuteReader();

我得到的错误是对的ExecuteReader行:

Exception Details: System.Data.OleDb.OleDbException: Syntax error (missing operator) in query expression 'page_title = ? limit 1'.

我使用@ P1的查询中作为当前尝试,以及?我试过以不同的方式添加参数,包括删除参数名称中的@。似乎没有任何工作。有人能指引我朝着正确的方向吗?

回答

4

AFAIK,MS Access中没有LIMIT子句。

而且,参数应该被命名为@p1你的情况,而不是?

我还没有与多年接入工作,所以我可能是错的,但不是LIMIT,试试这个:

Select TOP 1 ID from pages where page_title = @p1 

而且,如果合适的话,可以考虑这样的建议:

MS Access是不太合适的DBMS处理网站(我怀疑你的情况这是一个网站)。对于另一种基于文件的数据库管理系统,请检查SQLiteFirebirdSQL。两者都有很多可用于GUI的工具,如SQLite Maestro和IBExpert。
查询在这些DBMS中更加灵活。

+0

Legit?这太臭xD但这解决了这个问题。感谢您及时的回复! – MishieMoo 2011-03-08 19:06:04

+0

此外,这不是一个网站。我正在做一些本地的自动化测试,除了我之外,没有人会看到这个。我通常使用PHP/MySQL工作,但是我无法在这台机器上安装这些工具,所以这整件事情都非常糟糕(我花了4个多小时才用C#完成了这项工作,我可以在20分钟内完成这项工作!)。我也不能在这台机器上安装任何其他DBMS。所以我的选择是有限的=) – MishieMoo 2011-03-08 19:15:48

+0

不过,如果你再次需要这样的东西,尝试FirebirdSQL。不需要安装,只需将一堆库复制到应用程序文件夹中即可。你可以做一些查询,比如'SELECT FIRST 10 SKIP 20 * FROM table'。你不能在许多数据库管理系统中“跳过”行(Access是其中之一),总是有一种更复杂的方式将它放在'WHERE'子句中,比如'... WHERE rownum在21和30之间'或者其他的东西。 – AlexanderMP 2011-03-08 19:21:04