将 IDataReader 传递给继承 类 不关闭 C# 中的连接 ExecuteDataReaderAsync
Passing IDataReader to inherited classes not closing connections ExecuteDataReaderAsync in C#
我有一个严重的问题,我不知道如何解决它。我有多个指向主要数据提供程序 C# 库的库。我将其设置为执行对 ExecuteDataReaderAsync 的异步调用。但是,SQL 连接没有按预期关闭,所以我收到 SQL 连接池错误。
我尝试在 using 中包装 SqlConnection,但是 IDataReader 没有返回,因为它超出了 using 的范围。
这是我的主要数据提供者方法(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;
}
这里是一个继承class实现的例子:
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;
}
有什么办法可以解决这个问题吗?我们的应用程序将在几天内上线。
非常感谢!!
您必须在数据读取器上调用 Close()
方法,这将关闭连接。否则它将保持打开状态。由于您有此 CommandBehavior.CloseConnection
,因此在数据读取器上调用 Close()
将关闭基础连接。
我有一个严重的问题,我不知道如何解决它。我有多个指向主要数据提供程序 C# 库的库。我将其设置为执行对 ExecuteDataReaderAsync 的异步调用。但是,SQL 连接没有按预期关闭,所以我收到 SQL 连接池错误。
我尝试在 using 中包装 SqlConnection,但是 IDataReader 没有返回,因为它超出了 using 的范围。
这是我的主要数据提供者方法(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;
}
这里是一个继承class实现的例子:
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;
}
有什么办法可以解决这个问题吗?我们的应用程序将在几天内上线。
非常感谢!!
您必须在数据读取器上调用 Close()
方法,这将关闭连接。否则它将保持打开状态。由于您有此 CommandBehavior.CloseConnection
,因此在数据读取器上调用 Close()
将关闭基础连接。