Ошибка говорит "Отсутствует правильная круглая скобка" в моей инструкции SQL ... но это не так!Помогите? - PullRequest
3 голосов
/ 01 августа 2011

Вот мое утверждение из моей программы на C #:

(отредактировано gbn, отформатировано для ясности, поэтому не все в одной строке)

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();

    }

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

проблема может заключаться в том, что вы используете зарезервированное для оракула слово в качестве имени столбца и в качестве имени параметра, а именно CYCLE ... это может привести к странному и ошибочному поведению БД!

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

В зависимости от вашего провайдера БД вы можете использовать : вместо @ для параметров.

3 голосов
/ 01 августа 2011

Попробуйте удалить имеющиеся у вас скобки: они вам не нужны.

1 голос
/ 01 августа 2011

Вы пропустили 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...