将IDataReader传递给继承的类,而不是在C#中关闭连接ExecuteDataReaderAsync

时间:2016-12-15 22:55:57

标签: c# asynchronous sqldatareader

我遇到了严重的问题,我不知道如何解决它。我有多个库指向主数据提供程序C#库。我将其设置为执行对ExecuteDataReaderAsync的异步调用。但是,SQL连接未按预期关闭,因此我收到SQL连接池错误。

我尝试在使用中包装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;
        }

我有什么想法可以解决这个问题吗?我们的申请将在几天内上线。

非常感谢!!

1 个答案:

答案 0 :(得分:0)

您必须在datareader上调用Close()方法,这将关闭连接。否则它将保持开放。由于您拥有此CommandBehavior.CloseConnection,因此在datareader上调用Close()将关闭基础连接。