多个查询是否在单个连接上阻塞(SqlConnection)?

时间:2013-04-18 06:57:45

标签: c# sql-server

我在下面有一个示例数据访问方法设计,递归调用:

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(); 
        }



}

我的问题是:

  1. (作为一种好习惯)是否可以将连接作为参数传递?

  2. DeleteRecord方法放在Task上是否可以,所以每次调用它时,命令都没有等待执行查询的时间。 (当然有一个Task.WaitAll(tasks)某处)

  3. 在方案编号2上,连接是否会阻止通过服务器发送的多个查询?我经历过SQLServer在执行大量查询时暂停某些查询。 (默认情况下启用连接池,所以我想知道这是否也是第3项的情况)

2 个答案:

答案 0 :(得分:1)

您无法在连接上同时执行多个语句。如果要执行多个语句,则需要使用多个连接。但是,在你的情况下,这将是一个坏主意。您需要将删除包装在事务中以维护数据库一致性。删除单独连接上的项目无法实现事务一致性。

你应该考虑成套,而不是项目。一次传递所有要删除的项目。有关如何实现此目的的详细信息,请参阅Table-Valued Parameters。使用连接整个参数集的单个DELETE语句。

答案 1 :(得分:0)

(作为答案回复,因为我没有添加评论选项) - @ MarcinJuraszek:给他+5。 默认池大小为100(最大)。因此,它将暂停后续请求。为了克服这一点,必要时关闭每个开放连接的良好做法。

- 什么时候没用?只是意味着关闭代码末尾的连接。无论代码执行多少都无关紧要,它只会在到达指定的代码连接时关闭连接.close();