我试图远离另一个批处理文件,是可能的.我有一个SSIS包,从SQL中提取数据,创建一个文本文件,然后将这些文件发送到外部ftp站点.如果我从我的工作站或从服务器手动运行它,该程序包就可以运行.但是,当我将其作为SQL作业中的一个步骤运行时,该步骤失败 - 程序包无法连接.
使用SQL任务提取数据,For Each Loop Container用于创建文本文件,然后脚本任务用于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;
}
Run Code Online (Sandbox Code Playgroud)
我感谢所有回复的人!我想将此标记为已回答,以防其他人也遇到问题。使 sql 作业中的步骤以 32 位模式运行解决了我的问题。我将进行更多研究并找出原因并在博客中介绍它 - 希望其他人不必经历我脑海中发生的所有呻吟和呻吟:)
我真的必须在这里开始回答一些问题 - 因为你们都非常乐于助人且反应灵敏。再次感谢你!:)
| 归档时间: |
|
| 查看次数: |
9747 次 |
| 最近记录: |