SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0

Posted

技术标签:

【中文标题】SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0【英文标题】:SqlCommand Times Out, CommandTimeout and ConnectionTimeout both = 0 【发布时间】:2021-05-20 06:30:33 【问题描述】:

我正在通过 SSIS 包中的 C# 脚本任务从 SQL 数据库中运行大量数据提取。从包中的连接管理器获取到源的连接:

object rawConnection = Dts.Connections[sqlSpecItems["ConnectionManager"]].AcquireConnection(Dts.Transaction);
                SqlConnection connectionFromCM = (SqlConnection)rawConnection;

(splSpecItems 是一个 Dictionary 对象,提供要使用的连接管理器的名称)

连接管理器的ConnectionTimeout属性设置为0。为CM生成的连接字符串为:

Data Source=MyDatabase;User ID=MyUserName;Initial Catalog=MyDatabaseName;Persist Security Info=True;Asynchronous Processing=True;Connect Timeout=0;Application Name=MyPackageApplicationName;

连接用于返回一个SqlDataReader对象,如下:

private SqlDataReader GetDataReaderFromQuery(string sqlQueryToExecute)
        
            // connect to server
            SqlConnection sqlReaderSource = GetSourceSQLConnection();

            // create command
            SqlCommand sqlReaderCmd = new SqlCommand(sqlQueryToExecute, sqlReaderSource)
            
                CommandType = CommandType.Text, 
                CommandTimeout = 0
            ;

            // execute query to return data to reader
            SqlDataReader sqlReader = sqlReaderCmd.ExecuteReader();

            return sqlReader;               
        

操作失败并显示错误消息:

执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。

记录的操作开始和结束时间通常相隔约 50 秒,但最长可达 120 秒。

源数据库是 Business Central 云托管的 SQL 数据库。故障发生在少数特定提取上,较大的提取(尽管绝对值绝不是大,c20k 行)。当尝试通过 SSMS 查询这些时,通常会有延迟,因为必须将数据从源提取到内存中,我怀疑这是超时的原因(尽管连接和命令设置了 timeout = 0) .请注意,一旦失败发生一次,数据就在内存中,因此如果我重新启动作业,它不会重复。

我查看了此站点以及其他站点上的各种答案。到目前为止,我所看到的一切都没有让我知道我可能会尝试解决这个问题。任何帮助将不胜感激。

【问题讨论】:

默认的命令超时时间是 30 秒,你需要做大一些。一些软件库使用零来忽略超时,但在Net库中零不起作用。 你确定失败的代码使用的是同步的ExecuteReader方法,而不是BeginExecuteReader注意:较旧的 APM(异步编程模型)异步方法调用(例如 BeginExecuteReader)将忽略 CommandTimeout 属性。 SqlCommand.CommandTimeout Property @jdweng 我已将连接和命令的超时属性设置为 600。我仍然失败,记录的开始/结束时间差为 82 秒。 @AlwaysLearning 发布的代码是脚本任务中的确切代码。正在使用目录过程从 T-SQL 调用包。我明确地将它作为同步运行: exec [SSISDB].[catalog].[set_execution_parameter_value] @execution_id = @executionId , @object_type = 50 -- system parameter , @parameter_name = N'SYNCHRONIZED' , @parameter_value = 1; 【参考方案1】:

所以,我发现了问题。以防万一它对其他人有帮助,超时并没有因为读者而抛出。相反,我将阅读器传递给它下游的 SqlBulkCopy 操作。添加:

bulkCopy.BulkCopyTimeout = 0;

已解决问题...

【讨论】:

以上是关于SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0的主要内容,如果未能解决你的问题,请参考以下文章

SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0

.Net SqlCommand.ExecuteNonQuery 中的查询超时,适用于 SQL Server Management Studio

为什么我的实时网站出现超时错误

处理 ClientInsertServerInsert 同步冲突时出现 SQL 命令“超时”异常

ADO.NET_SqlCommand类

SqlCommand.ExecuteReader() 啥时候返回 null?