2009-02-03 48 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

的连接必须继续开放供读者使用。我相信关闭连接是你的问题。保持连接处于打开状态,并在完成时调用处理程序,我认为应该清理连接。