Я пытаюсь держаться подальше от другого пакетного файла, возможно. У меня есть пакет SSIS, который извлекает данные из SQL, создает текстовый файл и затем отправляет эти файлы на внешний ftp-сайт. Пакет работает, если я запускаю его вручную либо с моей рабочей станции, либо с сервера. Однако, когда я запускаю его как шаг в SQL-задании, этот шаг выходит из строя - пакет не удается подключиться.
Данные вытягиваются с использованием задачи SQL, для создания текстовых файлов используется контейнер для каждого цикла. Затем для части ftp используется Script Задача.
В целях устранения неполадок в рамках задачи Script я помещаю текст после каждого действия с кодом, с информацией, чтобы показать, где происходит ошибка. Я получаю пользователя, выполняющего задание, значение определенных переменных и строку соединения, а затем записываю это в таблицу журналов. Вот как я знаю, что пакет терпит неудачу, когда он пытается подключиться - я получаю ложное логическое значение из ftp.Connect().
В пакете есть переменные для информации о подключении ftp, и я использую файлы конфигурации для этих значений. Тем не менее, я жестко закодировал значения в коде для тестирования, и он дает те же результаты.
Я также попытался добавить новое подключение к диспетчеру соединений и использовать существующий - без разницы.
Я исключил проблемы с сетью/блокировкой/брандмауэром. Сервер разрешает подключение ftp.
Я также попытался запустить пакет вручную как сам, и как пользователь домена, который запускает пакет SSIS из заданий (пользователь домена sqlagent). Как с моей рабочей станции, так и с сервером выполняется ее работа вручную из любой учетной записи. Чтобы запустить его вручную с моей рабочей станции, я использую отладку Visual Studio. Чтобы запустить его вручную с сервера, я использую "Запустить пакет" при подключении к экземпляру служб Integration Services на сервере.
В приведенном ниже фрагменте кода я скопировал и вставлял части задачи Script - он должен содержать весь 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
Script Код задачи:
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;
}