Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlBulkCopy.WriteToServer不可靠地遵守BulkCopyTimeout_C#_.net_Sql Server 2008_Timeout_Sqlbulkcopy - Fatal编程技术网

C# SqlBulkCopy.WriteToServer不可靠地遵守BulkCopyTimeout

C# SqlBulkCopy.WriteToServer不可靠地遵守BulkCopyTimeout,c#,.net,sql-server-2008,timeout,sqlbulkcopy,C#,.net,Sql Server 2008,Timeout,Sqlbulkcopy,我需要计算SqlBulkCopy中的顺序超时异常。为了测试这一点,我使用一个外部应用程序启动一个事务并锁定目标表 只有在第一次调用时,SqlBulkCopy才会在预期的情况下引发超时异常。我们尝试了使用外部连接和事务,以及使用连接字符串和内部事务。对于外部连接和事务,无限等待从来不是在打开连接或开始或提交事务,而是始终在.WriteToServer 是否有某种方法可以使SqlBulkCopy.WriteToServer在达到其.BulkCopyTimeout限制时可靠地抛出超时异常 我更喜欢让异

我需要计算SqlBulkCopy中的顺序超时异常。为了测试这一点,我使用一个外部应用程序启动一个事务并锁定目标表

只有在第一次调用时,SqlBulkCopy才会在预期的情况下引发超时异常。我们尝试了使用外部连接和事务,以及使用连接字符串和内部事务。对于外部连接和事务,无限等待从来不是在打开连接或开始或提交事务,而是始终在.WriteToServer

是否有某种方法可以使SqlBulkCopy.WriteToServer在达到其.BulkCopyTimeout限制时可靠地抛出超时异常

我更喜欢让异常冒泡起来,而不是在使用块的范围内处理它们,但我总是可以重新冒泡。非常感谢您的洞察力

更新1:

仍然没有决议。但是发现了有趣的行为-在使SqlBulkCopy.WriteToServer方法无限期挂起的同一个锁期间,正常的SqlCommand将抛出预期的TimeoutException

以下是我们尝试过但失败的方法,以使SqlBulkCopy.WriteToServer在预期时一致地抛出超时:

启用/禁用多个活动结果集 桌面锁打开与关闭 目标为堆表与索引表 更长/更短的BulkTimeout值10秒到5分钟 内部交易与外部交易
现在,作为一种解决方法,我交替使用a将WriteToServer调用放入一个异步包装器中,这样我就可以自己计时,b只调用WriteToServer一次;超时后,等待常规SqlCommand成功后再尝试WriteToServer。使用这些方法,我至少能够控制执行流。

您是否尝试将SqlBulkOptions.TableLock选项传递给SqlBulkCopy?该选项报价意味着它将:

获取的批量更新锁 大容量复制操作的持续时间

因此,如果有另一个进程锁定了表,它将阻止获得锁,并且在理论上可以可靠地超时

更新: 我设置了自己的测试工具,无法复制。为了锁定表,我在SSMS中启动了一个事务,使用HOLDLOCK从TargetTable执行SELECT*FROM。我使用了与您在问题中包含的相同的BulkCopy方法,使用内部事务,批量加载超时为30秒。每次尝试大容量复制都会在30秒后按预期超时。然后,当我回滚SSMS事务时,它会成功

我使用的是SQLServer2008Express、.NET3.5

这不是第一次尝试后,大容量加载超时没有被正确传递?i、 它并不是以某种方式被设置为无限期

更新2:
还打开了连接字符串中的多个活动结果集支持,但每次都会持续超时。

我后来遇到了这个问题,为了解决这个问题,将BulkCopyTimeout设置为零

bulkCopy.BulkCopyTimeout = 0;

@阿达德夫:合理的建议,谢谢。我刚刚试过,在WriteToServer周围添加了一个try{}catch{}块,它只调用bulkCopy.Close然后重试。这应该是不必要的,因为SqlBulkCopy在一个using{}块中,但我已经绝望了。不幸的是,WriteToServer第二次仍然无限期地挂起。嗯,现在想不出其他任何东西了,这让我很困惑。我将尝试自己制作一个测试工具来复制。啊,我想知道.NET连接池是否与此有关,因为我一直在同一台机器上运行测试工具和批量插入进程。在SSMS中尝试了锁定方法,但仍然发生。我基本上是从循环中的代码块调用该方法,在迭代之间暂停30秒。我在调用WriteToServer之前将BulkCopyTimeout值打印到控制台,因此我确信该值是一致的。莫名其妙!我确实发现了一些关于多个活动结果集的信息,这些信息可能会影响超时。当我发现更多信息时将更新。谢谢PS-.NET 3.5,SQL Server 2008 Enterprise。已尝试启用和禁用多个活动结果集;类似的行为。有了它们,我有时会得到两次而不是一次及时的暂停。Win 7 x64和Win Server 2008 x64。感谢您在这里的洞察力和努力;这让我大吃一惊。只是想澄清一下发生了什么:启动锁定目标表的外部进程,然后尝试批量复制,它会按预期超时。然后再次尝试大容量复制。外部进程仍然在表上有锁,但这次它没有超时,只是挂起了?@AdaTheDev,是的,完全正确。外部进程启动事务,执行不带where子句的update命令,并等待用户输入回滚事务。大容量复制过程旨在重复重试,并根据超时次数执行不同的操作警报、暂停和故障切换
d、 查看我的最新更新-无法复制:我有相同的问题。我正在使用一个外部事务,这不会有任何帮助。在这种情况下,问题是bulkCopy没有超时。我希望它抛出,以便捕获并计算超时异常。然后,我可以评估是否有足够的数据表明存在严重问题。
bulkCopy.BulkCopyTimeout = 0;