2016-12-15 30 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以进行测试。非常感谢! –

相关问题