我在做 BULK 插入时遇到了可怕的问题。我实际上使用 SqlBulkCopy 将许多行插入到表中。起初,我会得到一个超时异常。因此,我将 SqlBulkCopy 的 BulkCopyTimeout 设置为荒谬的 [?] 1800 秒。(还)不会抛出异常。因此,我从 MS Server 管理工作室检查了活动监视器(如此处建议:超时已过期。在操作完成之前超时时间已过或服务器没有响应。语句已终止)并看到我的 BULK INSERT任务状态被挂起,等待类型为 LCK_M_RIn_LN。我的代码如下所示:
Using sqlCon As SqlConnection = connection.Connect()
Dim sqlBulkCopy As New SqlBulkCopy(sqlCon, SqlBulkCopyOptions.CheckConstraints And
SqlBulkCopyOptions.FireTriggers And
SqlBulkCopyOptions.KeepNulls And
SqlBulkCopyOptions.KeepIdentity, sqlTran)
sqlBulkCopy.BulkCopyTimeout = 1800 ' is this ridiculous?
sqlBulkCopy.BatchSize = 1000
sqlBulkCopy.DestinationTableName = destinationTable
sqlBulkCopy.WriteToServer(dataTableObject)
sqlTran.Commit()
End Using
我一直在网上寻找解决方案,但无济于事。虽然我找到了 LCK_M_RIn_LN 的这个定义:
当任务等待获取当前键值上的 NULL 锁以及当前键和上一个键之间的插入范围锁时发生。键上的 NULL 锁是即时释放锁。有关锁兼容性矩阵,请参阅 sys.dm_tran_locks (Transact-SQL)。
来自http://msdn.microsoft.com/en-us/library/ms179984.aspx
但这没有帮助。有人可以帮帮我。我最深的谢意。
编辑
我认为这是因为 KeepIdentity 属性,因为主键是自动递增的。这是根据SqlBulkCopy Insert with Identity Column。我会看看它是否能解决我的问题。
编辑 2
我不知道发生了什么,但是当我在管理工作室(使用直接 transact-sql)上测试 BULK 插入时效果很好。我不知道。也许它与 SqlBulkCopy 有关。当我检查活动监视器时,它生成的查询是这样的:
insert bulk TableName ([ColumnName] Int)
编辑 3
我忘了写我实际上是在使用实体框架,所以我复制了一个代码(实际上是从 c# 转换为 vb),它会从实体对象创建一个 DataTable,因为 EntityDataReader 仅适用于 C#(这让我很苦恼)。但不管怎么说。我丢弃了 SqlBulkCopy 的东西,只是将值存储在 XML 中,因为当我查看它时,我意识到我不需要数据库中的值。