Подготовьте заявление Проблемы - PullRequest
0 голосов
/ 15 декабря 2011

Я пытаюсь реализовать подготовленные этапы в своем коде как способ добавления параметров к командам 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()

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

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

1 Ответ

2 голосов
/ 15 декабря 2011

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

Это:

select VALUE from RWOL_CONFIGURATION where ID = @ItemId

Должно быть:

select VALUE from RWOL_CONFIGURATION where ID = ?

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

...