我在下面有一个示例数据访问方法设计,递归调用:
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)
某处)
答案 0 :(得分:1)
您无法在连接上同时执行多个语句。如果要执行多个语句,则需要使用多个连接。但是,在你的情况下,这将是一个坏主意。您需要将删除包装在事务中以维护数据库一致性。删除单独连接上的项目无法实现事务一致性。
你应该考虑成套,而不是项目。一次传递所有要删除的项目。有关如何实现此目的的详细信息,请参阅Table-Valued Parameters。使用连接整个参数集的单个DELETE语句。
答案 1 :(得分:0)
(作为答案回复,因为我没有添加评论选项) - @ MarcinJuraszek:给他+5。 默认池大小为100(最大)。因此,它将暂停后续请求。为了克服这一点,必要时关闭每个开放连接的良好做法。
- 什么时候没用?只是意味着关闭代码末尾的连接。无论代码执行多少都无关紧要,它只会在到达指定的代码连接时关闭连接.close();