SSIS - FTP - 从作业运行时失败,但手动时可以正常

时间:2013-05-31 17:27:55

标签: ftp ssis

我试图远离另一个批处理文件,这是可能的。我有一个SSIS包,从SQL中提取数据,创建一个文本文件,然后将这些文件发送到外部ftp站点。如果我从我的工作站或从服务器手动运行它,该程序包就可以运行。但是,当我将其作为SQL作业中的一个步骤运行时,该步骤失败 - 程序包无法连接。

使用SQL任务提取数据,For Each循环容器用于创建文本文件,然后脚本任务用于ftp部分。

为了进行故障排除,在脚本任务中,我在每次操作后都将文本放入代码中,并提供有助于显示错误发生位置的信息。我获取运行作业的用户,某些变量的值和连接字符串,然后将其写入日志表。这就是我知道包在尝试连接时失败的方式 - 我从ftp.Connect()收到一个错误的布尔值。

包中包含ftp连接信息的变量,我使用这些值的配置文件。但是,我已将值硬编码到测试代码中,并产生相同的结果。

我还尝试添加一个新连接到连接管理器而不是使用现有连接 - 没有区别。

我排除了任何网络/阻塞/防火墙问题。服务器允许ftp连接。

我也试过像我一样手动运行包,并尝试从作业中运行SSIS包的域用户(sqlagent域用户)。从我的工作站和服务器,从任一帐户手动运行它。要从我的工作站手动运行它,我使用Visual Studio调试。要从服务器手动运行它,我在连接到服务器上的Integration Services实例时使用“运行包”。

在下面的代码片段中,我复制并粘贴了脚本任务的部分内容 - 它应该包含所有ftp代码。我没有粘贴获取文件名和发送文件的部分。错误总是发生在连接部分。

我想要的是1)帮助使其工作,或者2)帮助确定如何从ftp.Connect获得更多的响应 - 布尔值只是告诉我很多,或者3)某人是一位专家告诉我,我应该使用一个批处理文件,不要再靠头撞墙了:)

我保证我做了很多研究,我发现了很多关于如何做ftp的帖子 - 但不是解决了这个问题。再次,代码工作,所以我知道如何做ftp部分本身。如果有一个我没看到的重复帖子,我道歉并将从那里读取而不是让某人在这里发布答案。 :)

补充数据:服务器 - Windows 2008 Enterprise SP2;工作站 - Windows XP SP3; SQL / SSIS:SQL Server 2008 R2

SQL作业步骤 - 类型:SSIS包;运行方式:SQL Server代理服务帐户(名为sqlagent的域帐户);身份验证:Windows身份验证

脚本任务代码:

string errMsg = null;
errMsg = "user: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name + "; ";
ConnectionManager cm = Dts.Connections["FTP_ABN"];
cm.ConnectionString = Dts.Variables["FTP_url"].Value.ToString() + ":21." + Dts.Variables["FTP_username"].Value.ToString();
cm.Properties["ServerName"].SetValue(cm, Dts.Variables["FTP_url"].Value.ToString());
cm.Properties["ServerPort"].SetValue(cm,"21");
cm.Properties["ServerUserName"].SetValue(cm, Dts.Variables["FTP_username"].Value.ToString());
cm.Properties["ServerPassword"].SetValue(cm, Dts.Variables["FTP_password"].Value.ToString());
FtpClientConnection ftp = new FtpClientConnection(cm.AcquireConnection(null));
ftpConnected = ftp.Connect();
if (ftpConnected) {    
errMsg += " - I connected: True; " + cm.ConnectionString.ToString() + "; ";
ftp.Close();
if (errMsg != null) { Dts.Log("YES - I am ok: " + errMsg, 0, new byte[0]); }
Dts.TaskResult = (int)ScriptResults.Success;
}
else {
errMsg += " - I connected: False; " + cm.ConnectionString.ToString() + "; ";
Dts.Log("Error: " + errMsg, 0, new byte[0]);
Dts.TaskResult = (int)ScriptResults.Failure;
}

3 个答案:

答案 0 :(得分:0)

我昨天遇到了这个问题。作为计划任务运行时脚本失败,但是当我运行它并且脚本使用安全ftp时它运行成功。对我来说问题是,当我使用本地登录登录时,我手动接受了安全的ftp加密证书。因此,当我从登录中运行它时,它成功运行。

我通过以拥有/运行计划任务的用户身份登录来修复它,然后我调用了ftp pgrogram(核心ftp)并接受了安全的ftp证书。

我希望能为你解决这个问题!

答案 1 :(得分:0)

您是否曾尝试使用FTP任务?

我在使用FTP时遇到了一些问题,我发现使用其中一项任务对我有所帮助。

如果您尝试过使用FTP任务,是否收到任何错误消息?

答案 2 :(得分:0)

感谢所有回复的人!我想将此标记为已解决,万一其他人也有问题。使sql作业中的步骤以32位模式运行解决了我的问题。我将研究更多,并找出原因和博客 - 希望其他人不必经历我头脑中发生的所有呻吟和呻吟:)

我真的不得不在这里开始回答一些问题 - 因为你们都很有帮助和反应灵敏。再次感谢你! :)