【问题标题】:C# OleDb select query throws missing operator exceptionC# OleDb 选择查询抛出缺少运算符异常
【发布时间】:2011-03-08 18:55:16
【问题描述】:

我目前正在连接并使用 MS Access 数据库。我可以很好地执行通用 select * 查询,因此我已连接到数据库,但是当我尝试使用参数进行选择时,它会引发缺少运算符异常。

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 以及当前的 ?。我尝试以不同的方式添加参数,包括删除参数名称中的@。似乎没有任何效果。有人能指出我正确的方向吗?

【问题讨论】:

    标签: c# ms-access oledb


    【解决方案1】:

    AFAIK,MS Access 中没有 LIMIT 子句。

    而且,参数应该命名为@p1,而不是?

    我已经多年没有使用 Access,所以我可能是错的,但不要使用 LIMIT,试试这个:

    Select TOP 1 ID from pages where page_title = @p1
    

    此外,如果合适,请考虑以下建议:

    MS Access 并不是处理网站的正确 DBMS(我怀疑在您的情况下它是一个网站)。如需其他基于文件的数据库管理系统,请查看SQLiteFirebirdSQL。两者都有很多可用于 GUI 的工具,例如 SQLite Maestro 和 IBExpert。
    这些 DBMS 中的查询更加灵活。

    【讨论】:

    • 合法吗?这很臭xD但这解决了这个问题。感谢您的快速回复!
    • 另外,这不适用于网站。我正在做一些本地自动化测试,所以除了我之外没有人会看到这个。我通常在 PHP/MySQL 中工作,但我无法在这台机器上安装它们,所以整个事情有点混乱(我花了 4 个多小时在 C# 中完成这个,而我本可以在 20 分钟内完成它!)。我也无法在这台机器上安装任何其他 DBMS。所以我的选择是有限的 =)
    • 不过,如果您再次需要类似的东西,请尝试 FirebirdSQL。无需安装,只需将一堆库复制到您的应用程序文件夹中。您将能够进行SELECT FIRST 10 SKIP 20 * FROM table 之类的查询。您不能在很多 DBMS 中“跳过”行(Access 就是其中之一),总是有一种更复杂的方法可以将其放在 WHERE 子句中,例如 ... WHERE rownum between 21 and 30 或其他东西。
    • Note that Jet/ACE TOP N will return ties, so choose your ORDER BY appropriately.当然,没有 ORDER BY 的 TOP N 是没有意义的。
    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2017-04-08
    相关资源
    最近更新 更多