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;
}
任何想法我怎麼能解決這個問題?我們的應用程序將在幾天內投入使用。
非常感謝你!
是否有更高效的方法來實現相同的目標?我有數百個位置。 –
它花費了大量的搜索,但得到了一切更新,並且它運行的很好,即使連接池大小爲2以進行測試。非常感謝! –