2014-10-10 2 views
0

Я пробовал все, что я могу найти в Интернете, чтобы заставить это работать.ODP.NET Параметрированный запрос не работает

Я использую VS2013, C#, Oracle.ManagedDataAccess v4 (проверено oracle.dataaccess.client v14), oracle 11g.

Я понимаю, следующий код должен работать (я знаю, что удаление соединений, usings и т.д. не хватаю, но я просто раздел его обратно)

public CustDetailsModel SelectCustDetails(string CustCode) 
{ 
    string sql; 
    OracleDataReader reader; 

    OracleConnection OraConn = OraConnection.GetConnection; 

     OraConn.Open(); 

     sql = "SELECT CUSTOMER, NAME, POSTCODE FROM CUSTOMER WHERE CUSTOMER = :CUSTCODE"; 

     OracleCommand cmd = new OracleCommand(sql, OraConn); 

     OracleParameter parameter = cmd.CreateParameter(); 
     parameter.ParameterName = "CUSTCODE"; 
     parameter.OracleDbType = OracleDbType.Varchar2; 
     parameter.Value = CustCode; 
     cmd.Parameters.Add(parameter); 

      reader = cmd.ExecuteReader(); 

      reader.Read(); 

      return new CustDetailsModel 
      { 
       Cust = reader.GetString(reader.GetOrdinal("CUSTOMER")), 
       CustName = reader.GetString(reader.GetOrdinal("NAME")), 
       CustPostCode = reader.GetString(reader.GetOrdinal("POSTCODE")), 
      }; 

} 

если заменить параметр с закодированным значением, это работает!

Он не работает с «Недопустимая операция против закрытого объекта», потому что запрос не возвращал строк.

Помогло ли кто-нибудь помочь?

Спасибо за чтение.

+0

Вы проверили это http://stackoverflow.com/questions/17062954/error-with-oracledatareader-error-invalid-operation-the-connection-is-closed? –

+0

@SergeyMalyutin - нет проблем с подключением к базе данных до ввода параметра. Мне интересно, есть ли у меня правильная версия ODAC для 11gR2. – radiator

ответ

2

Вы пошли сюда, чтобы загрузить правильную версию ODP.NET? ODP.NET Home Page

Я использовал версию 12 и работает для 11gr2.

Перейти к загрузке и нажмите здесь, чтобы загрузить ODAC с инструментами разработчика Oracle для Visual Studio.

Несколько вещей, чтобы убедиться, что вы правильно. Версия oracle client и ODP.NET-версии должны быть одинаковой бит'ностью 32 или 64. Вы не можете перекрещивать 32-битный клиент с 64-битным ODP или наоборот.

Если вышесказанное верно, то ваш ОК. Я подозреваю, что вы, потому что запрос работает жестко.

Возможно ли это? http://www.codeproject.com/Articles/208176/Gotcha-sharp-Using-Named-Parameters-with-Oracl

+0

спасибо за ответ. Я использую управляемый драйвер ODP без успеха. Опять же, он работает для всех запросов, которые не содержат параметров! Я пробовал все, что мог найти в Интернете, включая установку именованного параметра. Любая другая помощь очень ценится - спасибо снова. – radiator

+1

Спасибо за это. Эта ссылка на codeproject предоставила ответ. По сути, существует дополнительное свойство BindByName для объекта OracleCommand, которое должно быть установлено в true, чтобы связывать параметры по имени ». Аарх! – glaucon

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