下面我有这一个样本数据访问方法的设计要求递归:在单个连接(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 2013-04-18 07:00:13
@MarcinJuraszek,你什么意思'当它不被使用'?在我上面的代码中,总是使用'connection'对象。每次递归调用需要2至4秒。 – Shermay 2013-04-18 07:03:18
您不应尝试任何共享连接对象 - 理想情况下,您应该为每个命令对象创建一个新的连接对象,将其打开,执行命令(并处理任何结果集)并再次关闭它。在幕后,.NET将最小化* actual *网络连接的数量(请查阅连接池以获取更多信息) – 2013-04-18 07:51:13