Выборочная регистрация в 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-разрядном режиме.

Смотрите также

Почему происходит сбой подключения ODBC при запуске загрузки служб SSIS в Visual Studio, но не при запуске того же пакета с помощью служебной программы выполнения пакета

Другие вопросы по тегам