问题描述
我正在通过 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;
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 查询这些时,通常会有延迟,因为数据必须从源中提取到内存中,我怀疑这是超时的原因(尽管连接和命令的超时设置为 0) .请注意,一旦失败发生一次,数据就在内存中,因此如果我重新启动作业,它就不会重复。
我查看了本网站以及其他网站上的各种答案。到目前为止,我所看到的一切都没有让我知道我可能会尝试解决这个问题。任何帮助将不胜感激。
解决方法
所以,我发现了问题。以防万一它对其他人有帮助,超时不会因为读者而抛出。相反,我将读取器传递给它下游的 SqlBulkCopy 操作。添加:
bulkCopy.BulkCopyTimeout = 0;
已解决问题...