Задача скрипта SSIS C # для открытия Excel вызывает ошибку вызова

#c# #excel #ssis #script-task #ssis-2017

#c# #excel #ssis #сценарий-задача #ssis-2017

Вопрос:

У меня есть SSIS package задача скрипта, которая считывается из an Excel . Я получаю следующие ошибки и, похоже, не могу найти проблему.

Целью вызова было вызвано исключение.

в System.RuntimeMethodHandle.Метод вызова (цель объекта, аргументы Object[]
, сигнатурный сигнал, логический конструктор) в системе.Отражение.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] параметры, Object[] аргументы) в системе.Отражение.RuntimeMethodInfo.Вызов (Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) в System.RuntimeType .InvokeMember(имя строки, BindingFlags BindingFlags, Binder binder, цель объекта, Object[] providedArgs, модификаторы ParameterModifier[], CultureInfo culture, String[] namedParams) в Microsoft.SQLServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.executeScript()

Я сузил проблему до этих 2 строк, где я устанавливаю Excel приложение.

 Excel.Application xlApp;
xlApp = new Excel.ApplicationClass();
  

Похоже, что причиной ошибки является установка значения xlApp этого.

Я использую Visual Studio 2017.

Кто-нибудь может мне помочь в этом?

Комментарии:

1. Почему вы используете SQL Server (Microsoft.SQLServer) с Excel?

2. Я читаю в Excel из папки, но у них есть тенденция переименовывать лист. Итак, задача скрипта — прочитать имя листа, чтобы он мог правильно считывать из файла.

3. Поэтому вам нужно открыть каждый файл Excel » .xls «, а затем выполнить перечисление по именам листов.

4. Я понял это после. Пакет запускался пользователем через задание в SSMS. Мне пришлось создать пользователя, который запускал пакет в задании на сервере, на котором он был запущен. Это, казалось, дало ему доступ к функциям Excel на сервере.

Ответ №1:

Целью вызова было вызвано исключение.

Это общее исключение, которое выдается задачей скрипта при возникновении ошибки

Чтение реального сообщения об ошибке

Чтобы прочитать основное сообщение об ошибке, вы можете добавить в свой код предложение try catch и использовать метод Dts.FireError() для создания реального исключения.

 public void Main()
{
    try{

        Excel.Application xlApp;
        xlApp = new Excel.ApplicationClass();

        //...rest of code here

        Dts.TaskResult = (int)ScriptResult.Success;

    }catch(Exception ex){

        Dts.FireError(0,"An error occured", ex.Message,String.Empty, 0);
        Dts.TaskResult = (int)ScriptResult.Failure;

    }


}
  

Пытаюсь разобраться в проблеме

  1. Попробуйте использовать Excel.Application вместо ApplicationClass

     Excel.Application xlApp = new Excel.Application();
      
  2. Убедитесь, что на компьютере установлен Microsoft Excel, а сборки взаимодействия зарегистрированы в GAC

Комментарии:

1. Я помещаю его в блок try / catch и получаю сообщение об ошибке «не удается получить доступ к файлу». После попытки / перехвата для чтения имени листа Excel я перемещаю файл в другое место. Странно то, что он продолжает нормально перемещать файл, но затем запускает предложение catch в try над ним, в котором говорится, что он не может получить доступ к файлу?

2. и да, перед завершением try / catch я выполняю xlApp.Workbooks.Close() и xlApp.Quit()