Jas*_*ker 5 c# sql-server sql-server-2005 .net-3.5 linq-to-sql
我有一段看起来像这样的代码(ClearImportTable和InsertPage是存储过程):
datacontext.ClearImportTable() //Essentially a DELETE FROM table
for (int i = 1; i < MAX_PAGES; ++i){
datacontext.InsertPage(i); //Inserts data into the table
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码的一个简化版本,但想法是它在插入记录之前清除表.唯一的问题是,如果在ClearImportTable之后发生错误,则擦除表中的所有数据.有没有办法将它包装在一个事务中,这样如果有任何错误,一切都将按照它的方式放回去?
Sai*_*udo 11
你可以做一个交易范围:
using (var transaction = new TransactionScope())
{
// do stuff here...
transaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)
如果发生异常或者在没有命中transaction.Complete()的情况下保留using块,则回滚在using块中执行的所有操作.
您需要引用System.Transactions程序集.
正如上面提到的"Sailing Judo",当我需要调用存储过程时,我已经使用了TransactionScope块并取得了巨大的成功.然而,有一个"陷阱",我遇到了一个异常被抛出,说"交易有疑问".为了解决这个问题,我不得不在proc上调用一个非延迟方法来让它立即评估结果.而不是
using (var transaction = new TransactionScope())
{
var db = new dbDataContext();
db.StoredProc();
transaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)
我不得不这样称呼它......
using (var transaction = new TransactionScope())
{
var db = new dbDataContext();
db.StoredProc().ToList();
transaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,ToList()可以是任何非延迟方法,它使LINQ立即评估结果.
我想这是因为LINQs懒惰(延迟),自然是不能与交易的时间打得很好,但这只是一种猜测.如果有人能够对此有更多启发,我很乐意听到它.
| 归档时间: |
|
| 查看次数: |
6084 次 |
| 最近记录: |