У меня есть дизайн метод доступа выборки данных, ниже которого вызывает рекурсивно:Имеет ли несколько блоков запроса в одном соединении (SqlConnection)?
public static void DeleteRecord(SqlConnection connection, string childIds, string parentSheetname)
{
using (var adapter = new SqlDataAdapter("...", connection))
{
//fill a datatable
string newIds = "...";
string newParentName = "...";
const string query = "DELETE FROM table " +
"WHERE ids in (@ids) AND parent = @parent";
//Here's where recursion takes place
DeleteRecord(connection, newIds, newParentName);
using (var command = new SqlCommand(query, connection))
{
var parameters = new[] {
new SqlParameter(...), new SqlParameter(...)
}
command.Parameters.AddRange(parameters);
command.ExecuteNonQuery();
}
}
Мои вопросы:
(Как хорошая практика) Можно ли передать соединение в виде параметр?
Можно ли положить метод
DeleteRecord
наTask
, поэтому каждый раз, когда я его вызываю, нет времени на выполнение команды для выполнения запроса. (конечно, есть где-тоTask.WaitAll(tasks)
)- В случае с номером 2, соединение будет блокировать несколько запросов, отправленных по серверу? Я столкнулся с тем, что SQLServer приостанавливает выполнение некоторых запросов, если он выполняет тяжелый запрос. (Пулы соединений включена по умолчанию, так что мне интересно, если это также случай, здесь по пункту 3)
Вы должны использовать соединение по требованию - откройте его перед действием и освободите/закройте, когда это необходимо. Вы не должны держать соединение открытым, когда оно не используется. – MarcinJuraszek
@MarcinJuraszek, что значит «когда он не используется»? В моем коде выше всегда используется объект 'connection'. Для каждого рекурсивного вызова потребуется 2 - 4 секунды. – Shermay
Вам не следует пытаться использовать общий доступ к объектам подключения - в идеале, для каждого объекта команды необходимо создать новый объект подключения, открыть его, выполнить команду (и обработать любые результирующие наборы) и закрыть ее снова. За кулисами .NET сводит к минимуму количество * фактических * сетевых подключений (см. Пул соединений для получения дополнительной информации) –