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

SSIS-FTP-从作业运行时失败,但手动运行时正常,ftp,ssis,Ftp,Ssis,我试图远离另一个批处理文件,这是可能的。我有一个SSIS包,它从SQL中提取数据,创建一个文本文件,然后将这些文件发送到外部ftp站点。如果我从工作站或服务器手动运行该包,则该包可以工作。但是,当我将其作为SQL作业中的一个步骤运行时,该步骤失败—包无法连接 使用SQL任务提取数据,使用For-Each循环容器创建文本文件,然后对ftp部分使用脚本任务 出于故障排除的目的,在脚本任务中,我在代码中的每个操作之后都添加了文本,其中包含帮助显示错误发生位置的信息。我获取运行作业的用户、某些变量的值和

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

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

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

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

我也尝试过在连接管理器中添加一个新的连接,而不是使用一个现有的连接-没有区别

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

我还尝试以我自己和从作业中运行SSIS包的域用户(sqlagent域用户)的身份手动运行包。从我的工作站和服务器上,从任一帐户手动运行都可以。要从工作站手动运行它,我使用VisualStudio调试。要从服务器手动运行它,我在连接到服务器上的Integration Services实例时使用“run Package”

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

我想要的是1)帮助它工作,或者2)帮助确定如何从ftp获得更多响应。连接-布尔值并没有告诉我太多,或者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;
}

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

我以拥有/运行计划任务的用户身份登录,然后调用ftp pgrogram(核心ftp)并接受安全ftp证书,从而修复了此问题


我希望这也能帮你解决问题

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

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


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

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


我真的要开始回答一些问题了——因为你们都很乐于助人,反应迅速。再次感谢你!:)

谢谢你的第一个问题。它充满了细节,你尝试过的例子,遇到的错误和你的代码。我每天都会对这个问题进行投票,如果可以的话,我会在周日投票两次。你是否尝试过用一个简单的
runas
as
sqlagent
用户运行独立的代码?运行方式类似于
runas/user:company.com\sqlagent“dtexec/server myserver/SQL folder\MyPackage”
一个有用的疑难解答提示是,创建作业以运行SSIS包后,可以将作业切换到命令行,它将自动创建命令行语句以运行该包。然后,您可以自己运行该命令行来解决任何问题。您还可以修改命令行以执行额外的日志记录。试试这个,让我知道会发生什么。首先打开命令提示符,然后粘贴到
dtexec
语句中。另外,请注意32位与64位的问题,如果您不知道这些问题,这可能会给您带来麻烦。具体地说,您可能需要做额外的工作才能让
dtexec
命令为您正在运行的包运行正确的位版本。在线搜索应该会有所帮助。我很感激这个答案——我有一些东西是用WinSCP实现的(另一个完全独立的过程),我必须按照你提到的那样去做。然而,我正在SSIS脚本任务中尝试这一点,据我所知,该任务并没有使用单独的frp程序。幸运的是,我不必为此担心安全ftp。:)谢谢你!我没有尝试,因为我有多个文件要发送-我不想为每个文件建立新的连接。因为