2009-02-03 3 views
0

Я играл с демо-кодом из этой статьи msdn по Jeffrey Richter.Асинхронный SQLCommand и CCR

Я добавил новую функцию его ApmToCcrAdapters для обработки SqlCommand.BeginExecuteReader. Только он закрывает читателя, прежде чем я смогу его прочитать.

Следующий код используется для обеспечения FromIteratorHandler:

private static IEnumerator<ITask> AsyncReaderDemoHandler() 
    { 
     SqlDataReader reader = null; 
     SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=BizData;Integrated Security=True;Async=True;"); 
     string query = "SELECT * FROM Account;"; 
     SqlCommand command = new SqlCommand(query,connection); 

     connection.Open(); 
     yield return Arbiter.Choice(ApmToCcrAdapters.GetReader(command), 
      delegate(SqlDataReader r) { Msg("Got SQL data"); reader = r; }, 
      delegate(Exception e) { Msg("Failed to get SQL data"); }); 

     connection.Close(); 

     if (reader == null) yield break; 

     //This is where the code fails: Reader is Closed! 
     while (reader.Read()) 
     { 
      Console.WriteLine(reader["Account"]); 
     } 
    } 

Который, в свою очередь, вызывает следующий код:

/// <summary> 
    /// Gets the Reader, requires connection to be managed 
    /// </summary> 
    public static PortSet<SqlDataReader, Exception> GetReader(SqlCommand sqlCommand) 
    { 
     Port<SqlDataReader> portResponse = null; 
     Port<Exception> portException = null; 
     GetReaderResponse(sqlCommand, ref portResponse, ref portException); 
     return new PortSet<SqlDataReader, Exception>(portResponse, portException); 
    } 

    // Wrapper for SqlCommand's GetResponse 
    public static void GetReaderResponse(SqlCommand sqlCom, 
     ref Port<SqlDataReader> portResponse, ref Port<Exception> portException) 
    { 
     EnsurePortsExist(ref portResponse, ref portException); 
     sqlCom.BeginExecuteReader(ApmResultToCcrResultFactory.Create(
      portResponse, portException, 
      delegate(IAsyncResult ar) { return sqlCom.EndExecuteReader(ar); }), null); 
    } 

ответ

1

Соединение должно оставаться открытым для чтения, чтобы работать. Я считаю, что закрытие соединения - это ваша проблема. Оставьте открытое соединение и вызовите утилиту на считывателе, когда закончите, и я думаю, что это должно очистить соединение.

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