2011-12-15 6 views
0

Я пытаюсь реализовать подготовленные строки в моем коде как способ добавления параметров к командам sql, которые извлекаются из таблицы, хранящейся на любом общем сервере. Кажется, я не понимаю. Я получаю следующее сообщение об ошибке:Подготовить выписки

ORA-00936: missing expression 
ORA-00936: missing expression 

Prepare Statement: select VALUE from RWOL_CONFIGURATION where ID = @ItemId 

Я думаю, что он просто не заменяет значение, но я не знаю, что мне не хватает.

Я стараюсь добиться желаемого результата. Я создаю свой объект, получаю строку запроса из нашей таблицы в базе данных, добавляю ее в команду, добавляю параметры в объект списка и затем использую последний метод, показанный ниже, чтобы связать все это вместе и запустить запрос:

//This function gets me a config item from the database 
private string GetConfigurationItem(string itemId) 
    { 
     //new database connection object 
     OleDataBaseConnection oleDataBaseConnection = new OleDataBaseConnection(); 

     //todo get this query from the sql factory 
     SqlFactory sqlFactory = new SqlFactory(); 

     //This method gets the query string from the database 
     string sqlQuery = sqlFactory.GetQueryString("GET_CONFIGURATION_ITEM", m_dialect); 

     if (!String.IsNullOrEmpty(sqlQuery)) 
     { 
      //add parameter to list 
      oleDataBaseConnection.AddStoredProcedureParameter("@ItemId", itemId); 

      //execute the sql command after adding the parameters to the command 
      oleDataBaseConnection.OleExecutePrepareStatementWithParametersQuery(sqlQuery); 

      string returnValue = oleDataBaseConnection.NextRecord() ? oleDataBaseConnection.GetFieldById(0) : "Error"; 

      oleDataBaseConnection.Close(); 

      return returnValue; 
     } 
     else 
     { 
      return "ERROR"; 
     } 

    } 

//adds the parameters to list objects ready for the next method 
public void AddParameter(string parameter, object value) 
    { 
     m_parameterName.Add(parameter); 
     m_parameterValue.Add(value); 
    } // End of void AddParameter() 

    /// <summary> 
    /// Executes a command with the parameters passed to AddParameter(parameterName, parameterValue) and creates a recordset. 
    /// </summary> 
    /// 
    /// <param name="commandName">The name of the stored procedure to execute.</param> 
    public bool OleExecutePrepareStatementWithParametersQuery(string commandName) 
    { 
     if (String.IsNullOrEmpty(commandName)) 
     { 
      return false; 
     } 

     try 
     { 
      PrepareConnection(); 

      m_oleDatabaseCommand.CommandText = commandName; 
      m_oleDatabaseCommand.CommandType = CommandType.StoredProcedure; 

      if (m_storedProcedureParameterName.Count != 0) 
      { 
       for (int i = 0; i < m_storedProcedureParameterName.Count; i++) 
       { 
        m_oleDatabaseCommand.Parameters.AddWithValue(m_storedProcedureParameterName[i], m_storedProcedureParameterValue[i]); 
       } 

       m_storedProcedureParameterName.Clear(); 
       m_storedProcedureParameterValue.Clear(); 
      } 

      m_hasRecordSet = true; 

      m_oleDatabaseDataReader = m_oleDatabaseCommand.ExecuteReader(); 

      return true; 
     } 
     catch (Exception ex) 
     { 
      if (QueueErrors) 
      { 
       QueuedErrorsList.AppendLine(ex.Message); 
       QueuedErrorsList.AppendLine("Prepare Statement: " + storedProcedureName); 
       QueuedErrorsList.AppendLine(); 

       QueuedErrorCount++; 

       return false; 
      } 

      try 
      { 
       Close(); 
      } 
      catch 
      { 
      } 

      throw new Exception(ex.Message + "\r\n\r\nPrepare Statement: " + storedProcedureName); 
     } 
    } // End of void OleExecutePrepareStatementWithParametersQuery() 

Извините, если есть много кода, но это довольно просто, и я думал, что это поможет с проблемой.

Есть ли что-то очевидное, что остановило бы это от работы?

+0

Укажите значение 'sqlQuery'. – Oded

+0

Кроме того, что вы используете OleDb вместо поставщика Oracle? – Oded

+0

Потому что мы не просто используем базу данных оракула. У нас есть около 6 различных баз данных для общения с такими OLE, которые удовлетворяют нашим потребностям намного лучше. Команда хранится для каждого из разных диалектов базы данных, и мы извлекаем тот, который нам нужен, и мы должны добавить параметр или два к некоторым из них перед выполнением. Я хотел использовать простой String.Replace ("{0}", itemId); но босс хочет, чтобы я использовал что-то вроде выше, вместо этого сказал, что это обычный способ. Значение sqlQuery отображается в сообщении об ошибке. – CSharpened

ответ

2

Проблема в том, что поставщик OleDB не поддерживает именованные параметры в запросе.

Это:

select VALUE from RWOL_CONFIGURATION where ID = @ItemId 

Должно быть:

select VALUE from RWOL_CONFIGURATION where ID = ? 

См OleDbParameter на MSDN для примеров.

+0

Спасибо. Могла ли моя реализация быть изменена, чтобы разрешить несколько параметров? Если я просто использую? индикатор, то я предполагаю, что у меня будут проблемы при попытке сказать, где два предложения и попытки использовать? для обоих. Извините, но у MSDN нет примера для этого. Я использую m_oleDatabaseCommand.Parameters.AddWithValue (m_parameterName [i], m_parameterValue [i]); для добавления параметра в объект команды. – CSharpened

+1

@CSharpened - Вы можете добавить еще '?'. Один за параметр, и они будут заменены в порядке параметров (сначала? С первым параметром и т. Д.). Это означает, что если вам нужно несколько раз использовать параметр _same_, вам нужно добавить его много раз. – Oded

+0

Хорошо, отлично. Спасибо за вашу помощь. – CSharpened

Смежные вопросы