0

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

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方法放在a上,Task所以每次我调用它时,命令执行查询都没有等待时间。(当然有Task.WaitAll(tasks)地方)

  3. 在场景 2 中,连接是否会阻止通过服务器发送的多个查询?如果 SQLServer 执行繁重的查询,我已经体验过它会暂停一些查询。(默认情况下启用连接池,所以我想知道这是否也是第 3 项的情况)
4

2 回答 2

1

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

你应该在集合中思考,而不是项目。一次性传递所有要删除的项目。有关如何实现此目的的详细信息,请参见表值参数。使用连接整个参数集的单个 DELETE 语句。

于 2013-04-18T07:49:28.840 回答
0

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

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

于 2013-04-18T07:46:32.547 回答