2016-12-15 61 views
0

我有一個嚴重的問題,我不知道如何解決它。我有多個庫指向主數據提供者C#庫。我將其設置爲對ExecuteDataReaderAsync執行異步調用。但是,SQL連接沒有按預期關閉,所以我收到SQL連接池錯誤。將IDataReader傳遞給不關閉連接的繼承類ExecuteDataReaderAsync C#

我試着在一個使用中包裝SqlConnection,但是IDataReader並沒有得到返回,因爲它不在使用範圍之內。

這裏是我的主要數據提供方法(DataProvider.cs)

public virtual async Task<SqlDataReader> ExecuteDataReaderAsync(string StoredProcedureName, params object[] Parameters) 
     { 
      InitDatabase(); 

      var connection = new SqlConnection(databaseControllers[connectionStringName].ConnectionString); 


      var cmd = new SqlCommand() 
      { 
       Connection = connection, 
       CommandType = CommandType.StoredProcedure, 
       CommandText = dbPrefixName + StoredProcedureName, 
      }; 
      await connection.OpenAsync(); 

      SqlCommandBuilder.DeriveParameters(cmd); 
      if (cmd.Parameters.Count - 1 > Parameters.Count()) 
       throw new InvalidOperationException("The number of parameters provided does not match the number of parameters in the stored procedure. There are " + Parameters.Count().ToString() + " parameters provided, however the stored procedure requires " + cmd.Parameters.Count.ToString() + " parameters."); 

      for (int i = 0; i < Parameters.Count(); i++) 
      { 
       cmd.Parameters[i + 1].Value = Parameters[i]; 
      } 


      var reader = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection); 
      return reader; 

     } 

這裏是一個繼承類的實現的例子:

internal async Task<List<Models.PermitAssociatedApplication>> RemoveAssociatedApplication(int PermitApplicationId) 
     { 
      List<Models.PermitAssociatedApplication> temp = new List<Models.PermitAssociatedApplication>(); 
      using (IDataReader reader = await ExecuteDataReaderAsync("AssociatedApplications_RemoveApplication", PermitApplicationId)) 
      { 
       while (reader.Read()) 
        temp.Add(FillAssociatedApplication(reader)); 
      } 
      return temp; 
     } 

任何想法我怎麼能解決這個問題?我們的應用程序將在幾天內投入使用。

非常感謝你!

回答

0

您必須在數據採集器上調用Close()方法並關閉連接。否則它將保持開放。既然你有這個CommandBehavior.CloseConnection,那麼在datareader上調用Close()將關閉底層連接。

+0

是否有更高效的方法來實現相同的目標?我有數百個位置。 –

+0

它花費了大量的搜索,但得到了一切更新,並且它運行的很好,即使連接池大小爲2以進行測試。非常感謝! –