14

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

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

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

该软件包具有 ftp 连接信息的变量,我使用配置文件来获取这些值。但是,我已将这些值硬编码到代码中以进行测试,它会产生相同的结果。

我还尝试将新连接添加到连接管理器与使用现有连接 - 没有区别。

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

我还尝试以我自己的身份手动运行该程序包,并作为从作业中运行 SSIS 程序包的域用户(sqlagent 域用户)。在我的工作站和服务器上,从任一帐户手动运行它都可以。要从我的工作站手动运行它,我使用 Visual Studio 调试。要从服务器手动运行它,我在连接到服务器上的集成服务实例时使用“运行包”。

在下面的代码片段中,我复制并粘贴了部分脚本任务——它应该包括所有的 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;
}
4

3 回答 3

0

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

我真的将不得不在这里开始回答一些问题 - 因为你们都非常乐于助人和反应迅速。再次感谢你!:)

于 2013-06-03T14:25:08.450 回答
0

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

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

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

于 2013-05-31T17:36:27.940 回答
0

出于兴趣,您是否尝试过使用 FTP 任务?

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

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

于 2013-06-02T01:13:43.463 回答