c# - SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0
问题描述
我正在通过 SSIS 包中的 C# 脚本任务从 SQL 数据库中运行大量数据提取。从包中的连接管理器获取到源的连接:
object rawConnection = Dts.Connections[sqlSpecItems["ConnectionManager"]].AcquireConnection(Dts.Transaction);
SqlConnection connectionFromCM = (SqlConnection)rawConnection;
(splSpecItems 是一个 Dictionary 对象,提供要使用的连接管理器的名称)
连接管理器的 ConnectionTimeout 属性设置为 0。为 CM 生成的连接字符串为:
数据源=MyDatabase;用户ID=MyUserName;初始目录=MyDatabaseName;持久安全信息=True;异步处理=True;连接超时=0;应用程序名称=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 设置) . 请注意,一旦失败发生一次,数据就在内存中,因此如果我重新启动作业,它就不会重复。
我查看了该站点以及其他站点上的各种答案。到目前为止,我所看到的一切都没有让我知道我可能会尝试解决这个问题。任何帮助,将不胜感激。
解决方案
所以,我发现了问题。以防万一它对其他人有帮助,超时并没有因为读者而抛出。相反,我将阅读器传递给它下游的 SqlBulkCopy 操作。添加:
bulkCopy.BulkCopyTimeout = 0;
已清除问题...
推荐阅读
- azure - Azure Service Fabric:重新部署后台服务时出现超时错误
- spring-boot - 排除微服务的某些组件
- javascript - 设置在对象嵌套 3 级深
- r - 重新排序 ggplot2 geom_bar 中的因子计数数据
- excel - VLOOKUPNTH 单元格显示“#value”
- java - 不断收到 InputMismatchException
- ionic-framework - 选项卡数据未在 ionic 4 中加载动态数据
- haskell - 为什么 Haskell 中的 Functor 类不包含对象函数?是“纯”那个功能吗?
- java - 如何使用 HtmlUnit 显示所有 AJAX 请求
- jquery - 使用 jQuery/Ajax 在 localStorage 中存储 JSON 文件数据