Вы должны перемещать ваш вызов на Update(x,y)
где-нибудь за пределами внешнего блока using()
.
Вызов его изнутри using
означает, что вы устанавливаете другое соединение с той же базой данных без предварительного освобождения внешней. Если вы получаете количество рекурсивных вызовов, то у вас очень быстро заканчиваются бесплатные соединения.
Как правило, использование рекурсивных вызовов в частях кода, работающих с базами данных, считается очень плохой практикой.
Если вы ДЕЙСТВИТЕЛЬНО нуждаетесь в этой рекурсии здесь, то все же это должно быть сделано вне внешнего using
. Я бы посоветовал кэшировать ваш x,y
в какой-либо коллекции и отправлять вызовы на Update(x,y)
, пройдя эту коллекцию за пределами блока using
, например:
public static void Update(string p, int c)
{
// I'd suggest Dictionary, but don't know whether your strings are unique
var recursionParameters = new List<KeyValuePair<string, int>>();
using (SqlConnection conn = new SqlConnection("ConnectionString"))
{
...
//do something else and runn the Update() again with some other parameters
//Update(x, y); Don't do it here! Instead:
recursionParameters.Add(new KeyValuePair<string, int>(x,y));
...
}
foreach (var kvp in recursionParameters
{
Update(kvp.Key, kvp.Value)
}
}