Исключение было вызвано целью вызова - при выполнении файла .dtsx в Visual studio - PullRequest
2 голосов
/ 14 июня 2019

Я разработал пакет ssis, и у меня есть скрипт, который выбирает несколько текстовых команд из файла .txt, сохраняет их в переменных, и я использую эти переменные, чтобы увидеть, что делать дальше и какой дфт выполнить.

Когда я захожу в файл .dtsx -> щелчок правой кнопкой мыши -> выполнить ->, я получаю сообщение об ошибке «Исключение было сгенерировано целью вызова».

enter image description here

Однако, когда я прекращаю запуск пакета и пытаюсь повторно выполнить его, он запускается успешно.

Я попытался развернуть это в каталогах служб Integration Services, и он выдает ту же ошибку, которую я вижу в файлах отчетов

Ошибка задачи скрипта: исключение было выдано целью вызова

varERMLoadTxt содержит путь к текстовому файлу, который читает потоковая программа

public void Main()
        {
            // TODO: Add your code here
            string path = Dts.Variables["User::varERMLoadTxt"].Value.ToString();
            using (StreamReader sr = File.OpenText(path))
            {
                string line = File.ReadAllText(path);
                string[] lines = line.Split(',');
                if(lines[0].Equals("load", StringComparison.CurrentCultureIgnoreCase))
                Dts.Variables["User::varIsLoad"].Value = true;
                else if (lines[0].Equals("update", StringComparison.CurrentCultureIgnoreCase))
                    Dts.Variables["User::varIsUpdate"].Value = true;
                Dts.Variables["User::varCommand"].Value = lines[0].ToString();
                Dts.Variables["User::varAnalysisDate"].Value = lines[1].ToString();
                sr.Close();



            }
            Dts.TaskResult = (int)ScriptResults.Success;
        }

enum ScriptResults
{
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};

1 Ответ

1 голос
/ 22 июня 2019

У меня есть 3 предложения:

  1. Используйте блок try ... catch и метод Dts.FireError, чтобы прочитать реальное исключение:
  2. Проверьте, существует ли файл перед его открытием
  3. Проверьте правильность имен переменных (обратите внимание, что имена переменных чувствительны к регистру)

Весь код должен выглядеть следующим образом:

public void Main()
        {
        try{    

                string path = Dts.Variables["User::varERMLoadTxt"].Value.ToString();

        if (File.Exists(path))
        {
            using (StreamReader sr = File.OpenText(path))
                {
                string line = File.ReadAllText(path);
                    string[] lines = line.Split(',');

                    if(lines[0].Equals("load", StringComparison.CurrentCultureIgnoreCase))
                        Dts.Variables["User::varIsLoad"].Value = true;
                else if (lines[0].Equals("update", StringComparison.CurrentCultureIgnoreCase))
                    Dts.Variables["User::varIsUpdate"].Value = true;

            Dts.Variables["User::varCommand"].Value = lines[0].ToString();
                    Dts.Variables["User::varAnalysisDate"].Value = lines[1].ToString();
                    sr.Close();
                     }
            }   

            Dts.TaskResult = (int)ScriptResults.Success;    

        }catch(Exception ex){

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

            }

        }

enum ScriptResults
{
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...