Aracılığıyla paylaş


Özel görev hata ayıklama için destek ekleme

The Integration Services run-time engine enables packages, tasks, and other types of containers to be suspended during execution by using breakpoints.Kesme noktaları kullanımı, inceleme ve uygulama veya görevler düzgün çalışmasını engelleyebilecek hataları düzeltmek olanak sağlar.Kesme noktası mimarisi run - değerlendirmek istemci sağlarsaat nesneleri pakette tanımlı noktalarında görev işleme bekletilirken yürütme değeri.

Özel görev geliştiriciler bu mimari kullanarak özel kesme noktası hedefleri oluşturmak için kullanabileceğiniz IDTSBreakpointSite arabirimve üst arabirim, IDTSSuspend.The IDTSBreakpointSite interface defines the interaction between the run-time engine and the task for creating and managing custom breakpoint sites or targets.The IDTSSuspend interface provides methods and properties that are called by the run-time engine to notify the task to suspend or resume its execution.

Bir kesme noktası site veya hedef bir görevin yürütülmesine nerede işlemeyi askıya noktasıdır.Kullanıcıları Seç içinde kullanılabilir kesme noktası sitelerinden Yerleştirilen kesme noktası noktaları iletişim kutusu.Örneğin, varsayılan kesme noktası seçeneklere ek olarak, "Break" her döngü başında Foreach döngü kapsayıcı sunar seçenek.

Görev yürütme sırasında bir kesme noktası hedef ulaştığında, bir kesme noktası etkin olup olmadığını belirlemek için kesme noktası hedef olarak değerlendirilir.Bu, kullanıcı o kesme noktası noktasında durdurmak için yürütme istediğini gösterir.Kesme noktası etkinleştirilirse, görev harekete geçiren OnBreakpointHit olay run-saat motoru.Run -saat motoru çağırarak olaya yanıt Suspend yöntem, her görev şu anda çalışan paket.Görevin yürütülmesini sürdürür çalışma zamanı çağırdığında ResumeExecution yöntem, yarım kalmış bir görev.

Kesme noktaları kullanan görevleri hala uygulamak IDTSBreakpointSite ve IDTSSuspend arabirimleri.Bu paket diğer nesnelerin yükselttiğinizde görevi doğru askıya sağlar OnBreakpointHit olayları.

IDTSBreakpointSite arabirimi ve BreakpointManager

Görevler oluşturma kesme noktası hedefleri çağırarak CreateBreakpointTarget yöntem, BreakpointManager, parametre olarak bir tamsayı kimliği ve dize açıklaması sağlamaGörev içeren bir kesme noktası hedef kodunda bir noktaya geldiğinde, onu kesme noktası hedef kullanarak değerlendiren IsBreakpointTargetEnabled kesme noktasını etkin olup olmadığını belirlemek için kullanılan yöntem.If true, the task notifies the run-time engine by raising the OnBreakpointHit event.

The IDTSBreakpointSite interface defines a single method, AcceptBreakpointManager, which is called by the run-time engine during task creation.Bu yöntem bir parametre olarak sağlar BreakpointManager nesne, hangi sonra tarafından kullanılır görev oluşturma ve yönetme, kesme noktaları.Görevleri depolamak BreakpointManager sırasında kullanılmak üzere yerel olarak Validate ve Execute yöntemleri.

Aşağıdaki örnek kodu kullanarak bir kesme noktası hedef oluşturulması gösterilmiştir BreakpointManager.Örnek çağrı OnBreakpointHit yöntem olay oluşturmak için.

public void AcceptBreakpointManager( BreakpointManager breakPointManager )
{
   //   Store the breakpoint manager locally.
   this.bpm  = breakPointManager;
}
public override DTSExecResult Execute( Connections connections,
  Variables variables, IDTSComponentEvents events,
  IDTSLogging log, DtsTransaction txn)
{
   //   Create a breakpoint.
   this.bpm.CreateBreakPointTarget( 1 , "A sample breakpoint target." );
...
   if( this.bpm.IsBreakpointTargetEnabled( 1 ) == true )
      events.OnBreakpointHit( this.bpm.GetBreakpointTarget( 1 ) );
}
Public Sub AcceptBreakpointManager(ByVal breakPointManager As BreakpointManager)

   ' Store the breakpoint manager locally.
   Me.bpm  = breakPointManager

End Sub

Public Overrides Function Execute(ByVal connections As Connections, _
  ByVal variables As Variables, ByVal events As IDTSComponentEvents, _
  ByVal log As IDTSLogging, ByVal txn As DtsTransaction) As DTSExecResult

   ' Create a breakpoint.
   Me.bpm.CreateBreakPointTarget(1 , "A sample breakpoint target.")

   If Me.bpm.IsBreakpointTargetEnabled(1) = True Then
      events.OnBreakpointHit(Me.bpm.GetBreakpointTarget(1))
   End If

End Function

IDTSSuspend arabirimi

The IDTSSuspend interface defines the methods that are called by the run-time engine when it pauses or resumes execution of a task.The IDTSSuspend interface is implemented by the IDTSBreakpointSite interface, and its Suspend and ResumeExecution methods are usually overridden by the custom task.Zaman çalışma -saat motoru alır bir OnBreakpointHit olay görevden onu çağıran Suspend yöntem, her görevin çalışmasını, bilgilendirme görevleri duraklatma.Ne zaman istemci sürdürür yürütme run -saat çağrıları altyapısını ResumeExecution askıya alınmış görevlerin yöntem.

Askıya alma ve görev yürütme devam ettirme duraklatma ve yeniden başlatma görevin yürütme iş parçacığı içerir.De yönetilen kod, kullanarak bunu ManualResetEvent sınıfı System.Threading ad.net Framework.

Aşağıdaki kod örneği, askıya alınması ve sürdürme görevi yürütme gösterir.Dikkat Execute yöntem, yukarıdaki örnek kod, dan değişti ve zaman tetikleme yürütme iş parçacığı duraklatıldıkesme noktası.

private ManualResetEvent m_suspended = new ManualResetEvent( true );
private ManualResetEvent m_canExecute = new ManualResetEvent( true );
private int   m_suspendRequired = 0;
private int   m_debugMode = 0;

public override DTSExecResult Execute( Connections connections, Variables variables, IDTSComponentEvents events, IDTSLogging log, DtsTransaction txn)
{
   // While a task is not executing, it is suspended.  
   // Now that we are executing,
   // change to not suspended.
   ChangeEvent(m_suspended, false);
   
   // Check for a suspend before doing any work, 
   // in case the suspend and execute calls
   // were initiated at virtually the same time.
   CheckAndSuspend();
   CheckAndFireBreakpoint( componentEvents, 1);
}
private void CheckAndSuspend()
{
   // Loop until we can execute.  
   // The loop is required rather than a simple If
   // because there is a time between the return from WaitOne and the
   // reset that we might receive another Suspend call.  
   // Suspend() will see that we are suspended
   // and return.  So we need to rewait.
   while (!m_canExecute.WaitOne(0, false))
   {
      ChangeEvent(m_suspended, true);
      m_canExecute.WaitOne();
      ChangeEvent(m_suspended, false);
   }
}
private void CheckAndFireBreakpoint(IDTSComponentEvents events, int breakpointID)
{
   // If the breakpoint is enabled, fire it.
   if (m_debugMode != 0 &&    this.bpm.IsBreakpointTargetEnabled(breakpointID))
   {
      //   Enter a suspend mode before firing the breakpoint.  
      //   Firing the breakpoint will cause the runtime 
      //   to call Suspend on this task.  
      //   Because we are blocked on the breakpoint, 
      //   we are suspended.
      ChangeEvent(m_suspended, true);
      events.OnBreakpointHit(this.bpm.GetBreakpointTarget(breakpointID));
      ChangeEvent(m_suspended, false);
   }
   // Check for a suspension for two reasons: 
   //   1. If we are at a point where we could fire a breakpoint, 
   //      we are at a valid suspend point.  Even if we didn't hit a
   //      breakpoint, the runtime may have called suspend, 
   //      so check for it.     
   //   2. Between the return from OnBreakpointHit 
   //      and the reset of the event, it is possible to have
   //      received a suspend call from which we returned because 
   //      we were already suspended.  We need to be sure it is okay
   //      to continue executing now.
   CheckAndSuspend();
}
static void ChangeEvent(ManualResetEvent e, bool shouldSet)
{
   bool succeeded;
   if (shouldSet)
      succeeded = e.Set();
   else
      succeeded = e.Reset();

   if (!succeeded)
      throw new Exception("Synchronization object failed.");
            
}
public bool SuspendRequired
{
   get   {return m_suspendRequired != 0;}
   set
   {
      // This lock is also taken by Suspend().  
      // Because it is possible for the package to be
      // suspended and resumed in quick succession, 
      // this property might be set before
      // the actual Suspend() call.  
      // Without the lock, the Suspend() might reset the canExecute
      // event after we set it to abort the suspension.
      lock (this)
      {
         Interlocked.Exchange(ref m_suspendRequired, value ? 1 : 0);
         if (!value)
            ResumeExecution();
      }
   }
}
public void ResumeExecution()
{
   ChangeEvent( m_canExecute,true );
}
public void Suspend()
{
   // This lock is also taken by the set SuspendRequired method.  
   // It prevents this call from overriding an 
   // aborted suspension.  See comments in set SuspendRequired.
   lock (this)
   {
      // If a Suspend is required, do it.
      if (m_suspendRequired != 0)
         ChangeEvent(m_canExecute, false);
   }
   // We can't return from Suspend until the task is "suspended".
   // This can happen one of two ways: 
   // the m_suspended event occurs, indicating that the execute thread
   // has suspended, or the canExecute flag is set, 
   // indicating that a suspend is no longer required.
   WaitHandle [] suspendOperationComplete = {m_suspended, m_canExecute};
   WaitHandle.WaitAny(suspendOperationComplete);
}
Private m_suspended As ManualResetEvent = New ManualResetEvent(True)
Private m_canExecute As ManualResetEvent = New ManualResetEvent(True)
Private m_suspendRequired As Integer = 0
Private m_debugMode As Integer = 0

Public Overrides Function Execute(ByVal connections As Connections, _
ByVal variables As Variables, ByVal events As IDTSComponentEvents, _
ByVal log As IDTSLogging, ByVal txn As DtsTransaction) As DTSExecResult

   ' While a task is not executing it is suspended.  
   ' Now that we are executing,
   ' change to not suspended.
   ChangeEvent(m_suspended, False)

   ' Check for a suspend before doing any work, 
   ' in case the suspend and execute calls
   ' were initiated at virtually the same time.
   CheckAndSuspend()
   CheckAndFireBreakpoint(componentEvents, 1)

End Function

Private Sub CheckAndSuspend()

   ' Loop until we can execute.  
   ' The loop is required rather than a simple if
   ' because there is a time between the return from WaitOne and the
   ' reset that we might receive another Suspend call.  
   ' Suspend() will see that we are suspended
   ' and return.  So we need to rewait.
   Do While Not m_canExecute.WaitOne(0, False)
              ChangeEvent(m_suspended, True)
              m_canExecute.WaitOne()
              ChangeEvent(m_suspended, False)
   Loop

End Sub

Private Sub CheckAndFireBreakpoint(ByVal events As IDTSComponentEvents, _
ByVal breakpointID As Integer)

   ' If the breakpoint is enabled, fire it.
   If m_debugMode <> 0 AndAlso Me.bpm.IsBreakpointTargetEnabled(breakpointID) Then
              '   Enter a suspend mode before firing the breakpoint.  
              '   Firing the breakpoint will cause the runtime 
              '   to call Suspend on this task.  
              '   Because we are blocked on the breakpoint, 
              '   we are suspended.
              ChangeEvent(m_suspended, True)
              events.OnBreakpointHit(Me.bpm.GetBreakpointTarget(breakpointID))
              ChangeEvent(m_suspended, False)
   End If

   ' Check for a suspension for two reasons: 
   '   1. If we are at a point where we could fire a breakpoint, 
   '         we are at a valid suspend point.  Even if we didn't hit a
   '         breakpoint, the runtime may have called suspend, 
   '         so check for it.   
   '   2. Between the return from OnBreakpointHit 
   '         and the reset of the event, it is possible to have
   '         received a suspend call from which we returned because 
   '         we were already suspended.  We need to be sure it is okay
   '         to continue executing now.
   CheckAndSuspend()

End Sub

Shared Sub ChangeEvent(ByVal e As ManualResetEvent, ByVal shouldSet As Boolean)

   Dim succeeded As Boolean
   If shouldSet Then
              succeeded = e.Set()
   Else
              succeeded = e.Reset()
   End If

   If (Not succeeded) Then
              Throw New Exception("Synchronization object failed.")
   End If
 
End Sub

Public Property SuspendRequired() As Boolean
   Get
               Return m_suspendRequired <> 0
  End Get
  Set
    ' This lock is also taken by Suspend().  
     '   Because it is possible for the package to be
     '   suspended and resumed in quick succession, 
     '   this property might be set before
     '   the actual Suspend() call.  
     '   Without the lock, the Suspend() might reset the canExecute
     '   event after we set it to abort the suspension.
              SyncLock Me
                         Interlocked.Exchange(m_suspendRequired,IIf(Value, 1, 0))
                         If (Not Value) Then
                                    ResumeExecution()
                         End If
              End SyncLock
   End Set
End Property

Public Sub ResumeExecution()
   ChangeEvent(m_canExecute,True)
End Sub

Public Sub Suspend()

   ' This lock is also taken by the set SuspendRequired method.  
   ' It prevents this call from overriding an 
   ' aborted suspension.  See comments in set SuspendRequired.
   SyncLock Me
   ' If a Suspend is required, do it.
              If m_suspendRequired <> 0 Then
                         ChangeEvent(m_canExecute, False)
              End If
   End SyncLock
   ' We can't return from Suspend until the task is "suspended".
   ' This can happen one of two ways: 
   ' the m_suspended event occurs, indicating that the execute thread
   ' has suspended, or the canExecute flag is set, 
   ' indicating that a suspend is no longer required.
   Dim suspendOperationComplete As WaitHandle() = {m_suspended, m_canExecute}
   WaitHandle.WaitAny(suspendOperationComplete)

End Sub
Integration Services simgesi (küçük)Integration Services ile güncel kalın

En son karşıdan yüklemeler, makaleler, örnekler ve seçilen topluluk çözümleri yanı sıra Microsoft videolar için ziyaret Integration Services sayfa msdn veya TechNet:

Bu güncelleştirmelerle ilgili otomatik bildirim almak için, sayfadaki RSS akışlarına abone olun.

Ayrıca bkz.

Görevler