我正在使用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条记录之后。
因为错误似乎是随机的,所以我认为它与垃圾收集有关...
任何人都有线索?
答案 0 :(得分:2)
SubmitChanges
有一个隐含的交易。这里的问题是您的交易超时 - 您只是做得太多了。对于200k行,我会将SqlBulkCopy
用于临时表,然后运行命令或SPROC将200k移动到实际表中;也许在交易中使用该命令/ SPROC。
SqlBulkCopy
设计 - 它是一个连续的流或原始TDS数据,而不是 - 可以往返 - 并且在服务器端也是优化的(但结果是,必须使用临时表,否则您可能会冒未插入的插入信号。)