2014-09-04 4 views
-3

많은 코드가 있지만 주위에 거짓말을 많이 본 적이 있지만 분명히 도움이되지 않습니다.SSIS 스크립트 작업 실패 방법 (C#, 2008 사용)

내가 파일 금액 필드가있는 읽어지고 있습니다 여기에

내가 따라야 할 논리이다. 이 금액 입력란에는 제외 어가있을 수 있습니다. 파일에서 음수가 발견되면 파일을 옮기고 패키지를 실패해야합니다. 내가 지금까지 무슨 짓을

: 파일 경로를 얻기 위해

추가 스크립트 작업은 루프 내에서, 해당 경로에있는 모든 파일을 읽을 루프를 추가 (기록에 부정적인 양의 멤버를 이동하는 DTS 작업을 추가 세트, 레코드의 모든 행이 어떠했는지를 계산> 0 다음 따라서 패키지에 실패한 스크립트 작업, 다른 패스)

을하지 않을 경우, 확인하는 스크립트 작업을 추가 한 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;'단계가 실행되면 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 (dtable.Rows.Count > 0))가 있는지 여부를, 다음 문제는 거의 확실하게 제어 if 조건 관련 당신이 그것을 기대할 때 참으로.

이고 이 아니지만처럼 보이지 않을 수도 있습니다. 스크립트 작업에서 오류가 발생하여 실패한 다음 루프가 새로운 반복을 시작하고 다음 반복을 위해 스크립트 작업을 실행한다는 것이 발생할 수 있습니다. rapid fail -> next iteration -> next Script Task 실행으로 인해 스크립트 작업이 실패 후 실행 상태로 유지되는 것처럼 보일 수 있습니다.

스크립트 작업이 루프 반복을 막지 못하게하려면 루프ExecutionResult을 실패로 전환해야합니다. 이 작업은 스크립트 작업 FailParentOnFailure을 사용하거나 루프의 MaximumErrorCount 속성을 충분히 낮게 설정하여 스크립트 작업의 실패로 발생한 오류로 인해 루프의 MaximumErrorCount 임계 값이 충족되도록 할 수 있습니다.

0

정확하게 SPROC에 대한 특정 호출이 내 catch에 SQL 오류를 반환하면 종료합니다.

catch (SqlException ex) 
       { 
        ExceptionLogging.SendExcepToDB(ex); 
        Dts.TaskResult = (int)ScriptResults.Failure; 
        return; 
       }