我正在尝试使用linq2SQL将CSV文件的内容插入数据库表中。
如果任何插入失败,我希望能够回滚事务,但是当我尝试使用此代码时,在db.Transaction.Commit()处出现以下错误
未处理System.InvalidOperationException:此SqlTransaction已完成;它不再可用。
有人知道我在做什么错吗?
using (DataContext db = new DataContext())
{
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
foreach (string entry in entries)
{
XXX xxx = new XXX()
{
P1 = "something",
P2 = "something"
};
db.XXXX.InsertOnSubmit(xxx);
db.SubmitChanges();
}
}
catch (Exception)
{
db.Transaction.Rollback();
}
finally
{
db.Connection.Close();
}
db.Transaction.Commit();
}
好吧,排序是错误的-您在整个大块之后调用db.Transaction.Commit()
,因此即使发生异常并且您已经调用db.Transaction.Rollback();
也会被调用
将您的代码更改为:
using (DataContext db = new DataContext())
{
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
foreach (string entry in entries)
{
....
db.XXXX.InsertOnSubmit(xxx);
db.SubmitChanges();
}
db.Transaction.Commit(); <== CALL HERE !!
}
catch (Exception)
{
db.Transaction.Rollback();
}
finally
{
db.Connection.Close();
}
}
在这种情况下,将在foreach之后调用您的Commit,但是如果遇到异常并进行回滚,则不会调用它。
渣
我是一名优秀的程序员,十分优秀!