2014-09-04 3 views
-3

Я видел много кодов, лежащих вокруг, но, по-видимому, они не помогают.Как скомпрометировать задачу сценария SSIS (с использованием C#, 2008)

Вот логика я должен следовать:

У меня есть файл получать чтения, который имеет поле суммы. Это поле суммы может иметь отрицательные значения. Мне нужно переместить файл и выдать пакет, если я найду отрицательную сумму в файле.

То, что я сделал до сих пор:

Добавлена ​​задачей сценария, чтобы получить путь к файлу, добавляется цикл, чтобы прочитать все файлы в этом пути, внутри цикла (добавлено задание DTS для перемещения членов с отрицательными количествами к записи набор, добавил задачу сценария, чтобы проверить погоду есть какая-либо строка в наборе записей, если число> 0, то FAIL задачи сценария таким образом, не пакет, еще проход)

код в scipt выполнения задания:

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.Data.OleDb; 
using System.IO; 
using System.Xml; 

// name space call here etc, etc.. 
enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 
public void Main() 
     { 
      // TODO: Add your code here 

      bool fireAgain = true; 
      DataTable dtable = new DataTable(); 
      OleDbDataAdapter da = new OleDbDataAdapter(); 

      // Setting this incase there are multiple files being checked 
      Dts.Variables["InvalidFile"].Value = "False"; 


      da.Fill(dtable, Dts.Variables["NegativeAmountMember"].Value); 

      // I do get my desired result here of 1  
      Dts.Events.FireInformation(0, "dtable", dtable.Rows.Count.ToString(), String.Empty, 0, ref fireAgain); 

      if (dtable.Rows.Count > 0) 
      { 
       Dts.Variables["InvalidFile"].Value = "True"; 
       Dts.Events.FireInformation(0, "InvalidFile", Dts.Variables["InvalidFile"].Value.ToString(), String.Empty, 0, ref fireAgain); // This does get displayed but, nothing happens after this step. 
       Dts.TaskResult = (int)ScriptResults.Failure; // this method never technically executes 
       return; // added this because someone somewhere said in a post to do so 
      } 
      else 
      { 
       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
     } 

I все работает, за исключением этого сценария Tas к.

Я также попробовал FireError, даже если это не вызвано.

Что происходит, может ли кто-нибудь объяснить, пожалуйста?

+0

Я не понимаю ваш комментарий к 'Dts.TaskResult = (int) ScriptResults.Failure;' Это не работает. Помогите мне понять, как этого не происходит. – billinkc

+0

@billinkc У меня есть событие информации о пожаре, которое выполняется, но когда выполняется сценарий 'Dts.TaskResult = (int) ScriptResults.Failure;' step, ScriptTask никогда не останавливается/терпит неудачу. Он все еще находится в «желтой фазе». – DURTAYY

+0

Я думаю, вам нужно установить свойство 'Script Task'' ForcedParentOnFailure' или 'ForcedPackageOnFailure' в значение True в зависимости от вашего требования. У вас есть задача в контейнере цикла. – Tak

ответ

0

Ребята, я вычислил проблему. Проблема была в тупике в коде с переменной InvalidFile.

Добавлено:

Variables lockedVariables = null; 
    Dts.VariableDispenser.LockOneForWrite("InvalidFile", ref lockedVariables); 
    lockedVariables["InvalidFile"].Value = "True"; 
    lockedVariables.Unlock(); 

к коду, и вопрос в настоящее время нет. Что касается комментария @Ben Gribaudo о недопустимом цикле, цикл был действительным, мои комментарии в коде подсказывают это.

Заблокированная переменная также использовалась в задаче onError, где отправляется электронное письмо. Из-за того, что переменная, заблокированная в цикле для записи и задачи сценария, никогда не заканчивается до тех пор, пока onError не будет завершена, переменная останется заблокированной. После добавления кода lock for one write все это сработало.

Благодарим за помощь, объяснения и ответы.

3

В SSIS, сбой не прекращается автоматически (как вы выяснили). Отказ - это состояние, указывающее, что что-то пошло не так. Тот факт, что выполнение не останавливается внезапно при сбое, позволяет организовать грамотную обработку ошибок. Например, вы можете выполнить корректирующие действия при возникновении сбоя.

Приведенный ниже фрагмент кода из вашего вопроса задает результат задачи сбой (строка 1) и завершает выполнение задачи (строка 2).

Dts.TaskResult = (int)ScriptResults.Failure; 
return; 

Если задача не подведет/выполнение не останавливается, то проблема почти наверняка связана с if условия контролирующего ли выше код выполняется (if (dtable.Rows.Count > 0)) - как-то это условие не оценка к истине, когда вы этого ожидаете.

Это также возможно, что Task Script является неудачу но просто не похож на него. Что может случиться, так это то, что задача Script встречает ошибку и терпит неудачу, а затем цикл запускает новую итерацию и запускает задачу Script для следующей итерации. Быстрая сбой -> следующая итерация -> выполнение следующего сценария скрипта может сделать его похожим на то, что задача скрипта остается в рабочем состоянии после сбоя.

Если вы хотите, тот факт, что Task Script не в состоянии предотвратить цикл от дальнейшей итерации, вы как-то нужно переключить петли-хExecutionResult на провал. Вы можете сделать это, выполнив задание на скрипт FailParentOnFailure или установив свойство MaximumErrorCount цикла достаточно низким, чтобы ошибка, возникающая при сбое сценария, вызывала порог цикла.

0

Именно то, что я искал, выходите, если конкретный вызов SPROC возвращает ошибку SQL на мой catch.

catch (SqlException ex) 
       { 
        ExceptionLogging.SendExcepToDB(ex); 
        Dts.TaskResult = (int)ScriptResults.Failure; 
        return; 
       } 
Смежные вопросы