Асинхронный SQLCommand и CCR - PullRequest
       31

Асинхронный SQLCommand и CCR

0 голосов
/ 03 февраля 2009

Я играл с демо-кодом из этой статьи MSDN Джеффри Рихтер .

Я добавил новую функцию в его 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 Ответ

1 голос
/ 03 февраля 2009

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

...