Выборочная регистрация в Active Task SSIS
Я столкнулся с двумя проблемами в моем пакете служб SSIS. У меня в пакете служб SSIS есть активная задача, которая форматирует таблицу Excel в соответствии с моим требованием и сохраняет ее в другом файле, измененном.xlsx. Этот файл затем используется в моей задаче потока данных для обработки и загрузки данных в таблицы базы данных. Этот пакет отлично работает в моей локальной системе, но когда я создал запланированное задание на моем сервере SQL для запуска этого пакета, он выходит из строя с общим сообщением об ошибке "Утилита Microsoft (R) SQL Server Execute Package Version 11.0.5058.0 для 64-разрядного авторского права" (C) Корпорация Майкрософт. Все права защищены. Начато: 12:06:55 PM Ошибка: 2016-04-01 12:06:57.06 Код: 0x00000001 Источник: сценарий Описание задачи: Исключение было вызвано целью вызова. Ошибка завершения DTExec: выполнение пакета вернуло DTSER_FAILURE (1). Начато: 12:06:55. Завершено: 12:06:57. Прошло: 1.563 секунды. Сбой выполнения пакета. Шаг не выполнен."
Чтобы получить более подробное сообщение об ошибке, я попытался настроить ведение журнала для активной задачи. Я настроил ведение журнала, чтобы записывать записи журнала событий в файл CSV, как показано на снимке экрана ниже.
Я включил ведение журнала для пакета и проверил отдельные задачи, а также. В активные задачи я добавил Dts.Log("",0,bytes); отслеживать любые исключения, если таковые имеются также для регистрации каждого шага.
public partial class ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
byte[] bytes = new byte[0];
public void Main()
{
LogMessages("");
LogMessages("Update Bug package execution started at :: " + DateTime.Now.ToLongTimeString());
LogMessages("Loading package configuration values to local variables.");
FileName = Convert.ToString(Dts.Variables["User::ExcelFileName"].Value);
SourceFileLocation = Convert.ToString(Dts.Variables["User::SourceFileLoc"].Value);
SourceFileName = Path.Combine(SourceFileLocation, FileName);
saveLoc = Path.Combine(SourceFileLocation, "ModifiedExcel.xlsx");
var excel = new Excel.Application();
var workbook = excel.Workbooks.Open(SourceFileName);
try
{
foreach (Excel.Worksheet tempSheet in workbook.Worksheets)
{
LogMessages("For loop to check sheet names");
if (((Excel.Worksheet)(tempSheet)).Name.Contains("Test"))
{
if (File.Exists(saveLoc))
{
File.Delete(saveLoc);
}
//File.Create(saveLoc);
tempSheet.Select();
workbook.SaveAs(saveLoc);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(tempSheet);
}
workbook.Save();
workbook.Close();
excel.Quit();
LogMessages("Quit Excel sheet");
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
LogMessages("Release excel objects");
}
catch(Exception ex)
{
LogMessages("Exception: " + ex.InnerException);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
#region Log messages to package log files/table.
public void LogMessages(string strLogMsg)
{
Dts.Log(strLogMsg, 0, bytes);
}
#endregion
}
Но когда я запускаю пакет, файл журнала не обновляется. Файл журнала просто содержит следующее:
Поля: событие, компьютер, оператор, источник, идентификатор источника, идентификатор выполнения, время начала, время окончания, код данных, байты данных, сообщение
Может кто-нибудь, пожалуйста, помогите мне понять, что мне здесь не хватает для регистрации? Кроме того, что может быть причиной сбоя задания на сервере SQL?
1 ответ
Почему это не логи?
Вот самая забавная часть, которую я смог угадать за годы работы с SSIS. Dts.Log
довольно бесполезно, по крайней мере, если вы хотите, чтобы он отображался в средстве ведения журнала, встроенном в SSIS.
Вместо этого измените ваши вызовы Dts.Log на Dts.Events.Огонь, например
bool fireAgain = false;
Dts.Events.FireInformation(0, "This gest logged", "My long description here", string.Empty, 0, ref fireAgain);
Затем на вкладке " Сведения " выше убедитесь, что вы проверили OnInformation
событие (это также предполагает, что вы настроили пакет для отслеживания всего этого)
Наконец, если вы не нажмете кнопку на вкладке "Провайдеры и журналы", она не войдет в таблицу.
Почему это не работает?
Пакет не работает, потому что вы работаете с Excel, и в сообщении об ошибке указывается, что вы работаете в 64-битном режиме.
Microsoft (R) SQL Server Execute Package Utility Версия 11.0.5058.0 для 64-разрядных
Если вы не сделали что-то для явной работы 64-битного Excel на этом сервере, это не сработает. Вместо этого в задании агента SQL необходимо указать, что эта задача выполняется в 32-разрядном режиме.
Смотрите также