2009-02-03 2 views
0

이 msdn 기사의 데모 코드를 Jeffrey Richter으로 재생했습니다.비동기 SQLCommand 및 CCR

SqlCommand.BeginExecuteReader를 처리하기 위해 그의 ApmToCcrAdapters에 새로운 기능을 추가했습니다. 읽을 수 있기 전에 독자 만 닫고 있습니다.

다음 코드는 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

합니다. 연결을 끊는 것이 문제라고 생각합니다. 연결이 열린 채로두면 리더기에서 처리를 완료하고 연결을 정리해야한다고 생각합니다.