#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;
}
}
Пытаюсь разобраться в проблеме
-
Попробуйте использовать
Excel.Application
вместоApplicationClass
Excel.Application xlApp = new Excel.Application();
-
Убедитесь, что на компьютере установлен Microsoft Excel, а сборки взаимодействия зарегистрированы в GAC
Комментарии:
1. Я помещаю его в блок try / catch и получаю сообщение об ошибке «не удается получить доступ к файлу». После попытки / перехвата для чтения имени листа Excel я перемещаю файл в другое место. Странно то, что он продолжает нормально перемещать файл, но затем запускает предложение catch в try над ним, в котором говорится, что он не может получить доступ к файлу?
2. и да, перед завершением try / catch я выполняю
xlApp.Workbooks.Close()
иxlApp.Quit()