这个SqlTransaction已经完成;它不再可用

时间:2011-02-06 09:30:01

标签: .net linq-to-sql .net-4.0

我正在使用Linq to SQL和SQL Server 2008 SP2,我的应用程序是WinForm .net 4 我正在导入SQL Server 200,000条记录。 我正在创建对象并将它们附加到“insertonsubmit”上的datacontext。 然后我每100条记录做“submitChanges”。 我什么都没有交易。

我收到此错误

 "This SqlTransaction has completed; it is no longer usable." with stack
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()

出乎意料。 该错误不一致,可能出现在10,000条记录或27,200条记录或XXX条记录之后。

因为错误似乎是随机的,所以我认为它与垃圾收集有关...

任何人都有线索?

1 个答案:

答案 0 :(得分:2)

SubmitChanges有一个隐含的交易。这里的问题是您的交易超时 - 您只是做得太多了。对于200k行,我会将SqlBulkCopy用于临时表,然后运行命令或SPROC将200k移动到实际表中;也许在交易中使用该命令/ SPROC。

对于这种情况,

SqlBulkCopy 设计 - 它是一个连续的流或原始TDS数据,而不是 - 可以往返 - 并且在服务器端也是优化的(但结果是,必须使用临时表,否则您可能会冒未插入的插入信号。)