【问题标题】:Error says "Missing right parenthesis" in my SQL statement... but it's not! Help?错误在我的 SQL 语句中显示“缺少右括号”......但事实并非如此!帮助?
【发布时间】:2011-10-17 03:17:21
【问题描述】:

这是我的 C# 程序中的声明:

(由 gbn 编辑,为清晰起见进行了格式化,因此不是 all 在一行上)

DbCommand.CommandText =
             @"SELECT 
      HIST.MBRSEP, HIST.LOCATION, HIST.BILLTYPE, HIST.BILLMOYR, LOCINFO.CYCLE, 
      LOCINFO.DIST, LOCINFO.LOCATION
    FROM 
      (CAV_MBRHISTDEL AS HIST INNER JOIN CAV_LOCINFODETL AS LOCINFO ON HIST.LOCATION = LOCINFO.LOCATION)
    WHERE
       LOCINFO.CYCLE = @CYCLE AND 
       LOCINFO.DIST = @DISTRICT AND 
       HIST.BILLTYPE = '09' AND 
       HIST.BILLMOYR <> '9999'";

这是错误信息:

错误 [HY000] [Oracle][ODBC][Ora]ORA-00907: 缺少右括号

我的 SQL 语句中只有两个括号,一个右一个,一个左一个。我不确定错误告诉我什么。有什么建议吗?

编辑:这是参数的定义方式:

        string cycle = cbCycle.Text;
        string district = cbDistrict.Text.Substring(0,2);

这是我将它们添加到 DbCommand 的地方:

        DbCommand.Parameters.AddWithValue("@CYCLE", cycle);
        DbCommand.Parameters.AddWithValue("@DISTRICT", district);

这是我的完整代码,当有人点击我的表单上的“开始”按钮时触发:

private void btnGo_Click(object sender, EventArgs e)
    {
        //get parameters
        string cycle = cbCycle.Text;
        string district = cbDistrict.Text.Substring(0,2);

        //create a connection to the database
        OdbcConnection DbConnection = new OdbcConnection("DSN=UPN2;uid=xxx;pwd=xxxx");
        DbConnection.Open();

        //create a command to extract the required data and
        //assign it to the connection string
        OdbcCommand DbCommand = DbConnection.CreateCommand();
        DbCommand.CommandText =
             @"SELECT HIST.MBRSEP, HIST.LOCATION, HIST.BILLTYPE, HIST.BILLMOYR, LOCINFO.CYCLE, LOCINFO.DIST, LOCINFO.LOCATION FROM CAV_MBRHISTDEL AS HIST INNER JOIN CAV_LOCINFODETL AS LOCINFO ON HIST.LOCATION = LOCINFO.LOCATION WHERE LOCINFO.CYCLE = @CYCLE AND LOCINFO.DIST = @DISTRICT AND HIST.BILLTYPE = '09' AND HIST.BILLMOYR <> '9999'; ";

        DbCommand.Parameters.AddWithValue("@CYCLE", cycle);
        DbCommand.Parameters.AddWithValue("@DISTRICT", district);

        //Create a DataAdapter to run the command and fill the datatable
        OdbcDataAdapter da = new OdbcDataAdapter();
        da.SelectCommand = DbCommand;
        DataTable dt = new DataTable();
        da.Fill(dt);


        tbOutput.Text = PrintDataTable(dt);

        DbCommand.Dispose();
        DbConnection.Close();

    }

【问题讨论】:

  • 你能告诉你如何设置参数吗?它们是什么数据类型
  • 通常当您遇到此类错误时,这意味着查询编译器预期在特定点有一个右括号,但发现了其他东西。这可能并不意味着有 no 右括号(尤其是在这种情况下肯定有)。查询编译器还没有到达那里。
  • 你为什么还需要它们?这只是一个连接。
  • 我建议删除你的括号,看看它是如何运行的。我不确定 Oracle,但在大多数 T-SQL DBMS 中,它会在结果行集的括号之后需要某种别名。
  • gnb,我对原始帖子进行了编辑,并添加了您想要查看的信息。谢谢!

标签: c# sql oracle


【解决方案1】:

尝试删除您拥有的括号:您不需要它们。

【讨论】:

  • 我实际上删除了括号,并收到一条错误消息说 ORA-00933: SQL 命令未正确结束。
  • 进展,那么。尝试放一个 ;在声明的最后。不过,这只是一个猜测:我更像是一个 sql server 人。
  • 我试过了,但得到了关于未正确结束的相同消息:“错误 [HY000] [Oracle][ODBC][Ora]ORA-00933: SQL 命令未正确结束”。好奇怪!
  • 您还需要删除表别名的“AS”。
  • @jonearles:我会发布您的评论作为答案,因为它与 Joel 的建议有很大不同,我认为这实际上可能是这里真正的问题。
【解决方案2】:

您在内部查询中缺少SELECT。试试这个:

...
FROM 
    (SELECT CAV_MBRHISTDEL AS HIST -- Added SELECT
    INNER JOIN CAV_LOCINFODETL AS LOCINFO ON HIST.LOCATION = LOCINFO.LOCATION)
WHERE
...

你有:

FROM 
    (CAV_MBRHISTDEL ... -- Missing SELECT

【讨论】:

  • 啊,是的,这可能会导致问题!我将 SELECT 添加到内部查询并尝试运行该程序。我收到了另一个错误消息,但至少它是不同的。当我尝试填写数据表 dt 时,它会出错并显示 ORA-00903: invalid table name。嗯。
  • 好吧,我再次验证了我的表名是正确的,所以我不确定为什么会有错误消息说“无效的表名”。
  • wtf?为什么投反对票??顺便说一句,你可能需要给你的内部选择一个别名 - 试试这个:...ON HIST.LOCATION = LOCINFO.LOCATION) X
  • 投反对票的不是我。嘿,我正在寻找我能得到的所有帮助!我会尝试给内部选择一个别名,看看会发生什么。感谢您的帮助!
【解决方案3】:

问题可能是您使用 oracle 保留字作为列名和参数名 - 即 CYCLE... 这样做可能会导致 DB 出现奇怪和不稳定的行为!

http://download.oracle.com/docs/cd/B19306_01/em.102/b40103/app_oracle_reserved_words.htm

根据您的数据库提供商,您可能希望使用 : 而不是 @ 作为参数。

【讨论】:

  • 嗯。我想知道这是否可能是问题的一部分,使用保留关键字“循环”?
  • 是的,这是让一切正常运行的最后一块。我非常感谢您的帮助,Yahia 以及其他所有愿意提供帮助的人。
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多