2011-03-21 5 views
2

Это первый раз, когда мне нужно работать с Oracle, и поскольку мы все ненавидим работать с иностранными вещами, пока вы работаете с определенной моделью несколько лет, хотя это наша работа, и мы должны это сделать.InvalidOperationException при попытке ExecuteReader() с Oracle Data Access ODP.NET 11.2

Теперь я установил Oracle 11 g и скопировал и ссылался на Oracle.DataAccess.dll, создав метод, в котором открывается соединение, и пытается получить некоторые объекты из представления, созданного на сервере.

Метод:

public BindingList<HeaderReceiver> GetHeaderReceivers() 
{ 
    try 
    { 
     using (OracleConnection db = new OracleConnection(BaseDataAccess.ConnString)) 
     { 
      string cmdText = "select * from p_customer t"; 
      BindingList<HeaderReceiver> headerReceivers = new BindingList<HeaderReceiver>(); 

      OracleCommand cmd = new OracleCommand(cmdText) { CommandType = CommandType.Text }; 
      db.Open(); 

      OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); <--- Error Occurs HERE!!! 

      while (reader.Read()) 
       headerReceivers.Add(HeaderReceiver.GetInstance(reader)); 

      CustBranchRepository rep = new CustBranchRepository(); 
      headerReceivers.ForEach(p => p.DetailsBranch = rep.GetDetailReceivers(p.Id)); 

      reader.Close(); 
      db.Close(); 
      return headerReceivers; 
     } 
    } 
    catch (Exception ex) 
    { 
     ExporterLogger.Log(ex); 
     return null; 
    } 
} 

Теперь, когда ExecuteReader() совершает я получаю эту InvalidOperationException.

Operation is not valid due to the current state of the object. 

StackTrace:

at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(CommandBehavior behavior) 
    at Exporter.Boss.DataAccess.CustomerRepository.GetHeaderReceivers() in ...Exporter\Exporter.Boss.DataAccess\CustomerRepository.cs:line 25 

Любые мысли и помочь ...

Спасибо!

ответ

9

Похоже, вы пропустили соединение на объекте команды ...

db.Open(); 
OracleCommand cmd = new OracleCommand(cmdText) { CommandType = CommandType.Text }; 
cmd.Connection = db; 
+1

Найден этот пост. У меня была именно эта ошибка при вызове ExecuteDataReader() в моем объекте Command. Оказывается, я установил соединение в объекте Command, но я сделал это после вызова ExecuteDataReader(). Когда я переключил две линии, он работал отлично. Таким образом, это должно быть отмечено как правильный ответ imo. – Jeroen