Bagikan melalui


Memvalidasi Komponen Aliran Data

Berlaku untuk: SQL Server SSIS Integration Runtime di Azure Data Factory

Metode Validate PipelineComponent kelas dasar disediakan untuk mencegah eksekusi komponen yang tidak dikonfigurasi dengan benar. Gunakan metode ini untuk memverifikasi bahwa komponen memiliki jumlah objek input dan output yang diharapkan, bahwa properti kustom komponen memiliki nilai yang dapat diterima, dan bahwa koneksi apa pun, jika diperlukan, ditentukan. Gunakan metode ini juga untuk memverifikasi bahwa kolom dalam koleksi input dan output memiliki jenis data yang benar dan bahwa DTSUsageType dari setiap kolom diatur dengan tepat untuk komponen. Implementasi kelas dasar membantu dalam proses validasi dengan memeriksa kumpulan kolom input komponen dan memastikan bahwa setiap kolom dalam koleksi mengacu pada kolom di IDTSOutputCollection100 komponen hulu.

Metode Validasi

Metode Validate ini dipanggil berulang kali ketika komponen diedit di SSIS Designer. Anda dapat memberikan umpan balik kepada perancang dan kepada pengguna komponen melalui DTSValidationStatus nilai pengembalian enumerasi, dan dengan memposting peringatan dan kesalahan. Enumerasi DTSValidationStatus berisi tiga nilai yang menunjukkan berbagai tahap kegagalan, dan yang keempat, VS_ISVALID, yang menunjukkan apakah komponen dikonfigurasi dengan benar dan siap untuk dijalankan.

Nilai VS_NEEDSNEWMETADATA menunjukkan bahwa kesalahan ada di ComponentMetaData, dan bahwa komponen dapat memperbaiki kesalahan. Jika komponen mengalami kesalahan metadata yang dapat diperbaiki, komponen tersebut tidak boleh memperbaiki kesalahan dalam Validate metode , dan ComponentMetaData tidak boleh dimodifikasi selama validasi. Sebaliknya, Validate metode harus mengembalikan hanya VS_NEEDSNEWMETADATA, dan komponen harus memperbaiki kesalahan dalam panggilan ke ReinitializeMetaData metode , seperti yang dijelaskan nanti di bagian ini.

Nilai VS_ISBROKEN menunjukkan bahwa komponen memiliki kesalahan yang dapat diperbaik dengan mengedit komponen di perancang. Kesalahan biasanya disebabkan oleh properti kustom atau koneksi yang diperlukan yang tidak ditentukan atau salah diatur.

Nilai kesalahan akhir adalah VS_ISCORRUPT, yang menunjukkan bahwa komponen telah menemukan kesalahan yang seharusnya hanya terjadi jika ComponentMetaData properti telah dimodifikasi secara langsung, baik dengan mengedit XML paket atau dengan menggunakan model objek. Misalnya, kesalahan semacam ini terjadi ketika komponen hanya menambahkan satu input, tetapi validasi menemukan bahwa lebih dari satu input ada di ComponentMetaData. Kesalahan yang menghasilkan nilai pengembalian ini hanya dapat diperbaiki dengan mengatur ulang komponen dengan menggunakan tombol Reset di kotak dialog Editor Lanjutan.

Selain mengembalikan nilai kesalahan, komponen memberikan umpan balik dengan memposting peringatan atau kesalahan selama validasi. Metode FireWarning dan FireError menyediakan mekanisme ini. Ketika metode ini dipanggil, peristiwa ini diposting di jendela Daftar Kesalahan SQL Server Data Tools (SSDT). Pengembang komponen kemudian dapat memberikan umpan balik langsung kepada pengguna tentang kesalahan yang telah terjadi, dan jika sesuai, cara memperbaikinya.

Contoh kode berikut menunjukkan implementasi yang ditimpa dari Validate.

public override DTSValidationStatus Validate()  
{  
    bool pbCancel = false;  
  
    // Validate that there is one input.  
    if (ComponentMetaData.InputCollection.Count != 1)  
    {  
    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, out pbCancel);  
    return DTSValidationStatus.VS_ISCORRUPT;  
    }  
  
    // Validate that the UserName custom property is set.  
    if (ComponentMetaData.CustomPropertyCollection["UserName"].Value == null || ((string)ComponentMetaData.CustomPropertyCollection["UserName"].Value).Length == 0)  
    {  
        ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, out pbCancel);  
        return DTSValidationStatus.VS_ISBROKEN;  
    }  
  
    // Validate that there is one output.  
    if (ComponentMetaData.OutputCollection.Count != 1)  
    {  
        ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, out pbCancel);  
        return DTSValidationStatus.VS_ISCORRUPT;  
    }  
  
    // Let the base class verify that the input column reflects the output   
    // of the upstream component.  
    return base.Validate();  
}  
Public  Overrides Function Validate() As DTSValidationStatus   
  
 Dim pbCancel As Boolean = False  
  
 ' Validate that there is one input.  
 If Not (ComponentMetaData.InputCollection.Count = 1) Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISCORRUPT   
 End If   
  
 ' Validate that the UserName custom property is set.  
 If ComponentMetaData.CustomPropertyCollection("UserName").Value Is Nothing OrElse CType(ComponentMetaData.CustomPropertyCollection("UserName").Value, String).Length = 0 Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISBROKEN   
 End If   
  
 ' Validate that there is one output.  
 If Not (ComponentMetaData.OutputCollection.Count = 1) Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISCORRUPT   
 End If   
  
 ' Let the base class verify that the input column reflects the output   
 ' of the upstream component.  
  
 Return MyBase.Validate   
  
End Function  

Metode ReinitializeMetaData

Metode ReinitializeMetaData ini dipanggil oleh SSIS Designer setiap kali Anda mengedit komponen yang kembali VS_NEEDSNEWMETADATA dari metodenya Validate . Komponen harus berisi kode yang mendeteksi dan memperbaiki masalah yang diidentifikasi oleh komponen selama validasi.

Contoh berikut menunjukkan komponen yang mendeteksi masalah selama validasi dan memperbaiki kesalahan ini dalam ReinitializeMetaData metode .

private bool areInputColumnsValid = true;  
public override DTSValidationStatus Validate()  
{  
    IDTSInput100 input = ComponentMetaData.InputCollection[0];  
    IDTSVirtualInput100 vInput = input.GetVirtualInput();  
  
    bool Cancel = false;  
    foreach (IDTSInputColumn100 column in input.InputColumnCollection)  
    {  
        try  
        {  
            IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);  
        }  
        catch  
        {  
            ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, out Cancel);  
            areInputColumnsValid = false;  
            return DTSValidationStatus.VS_NEEDSNEWMETADATA;  
        }  
    }  
  
    return DTSValidationStatus.VS_ISVALID;  
}  
public override void ReinitializeMetaData()  
{  
    if (!areInputColumnsValid)  
    {  
        IDTSInput100 input = ComponentMetaData.InputCollection[0];  
        IDTSVirtualInput100 vInput = input.GetVirtualInput();  
  
        foreach (IDTSInputColumn100 column in input.InputColumnCollection)  
        {  
            IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);  
  
            if (vColumn == null)  
                input.InputColumnCollection.RemoveObjectByID(column.ID);  
        }  
        areInputColumnsValid = true;  
    }  
}  
Private areInputColumnsValid As Boolean = True   
  
Public  Overrides Function Validate() As DTSValidationStatus   
 Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)   
 Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput   
 Dim Cancel As Boolean = False   
 For Each column As IDTSInputColumn100 In input.InputColumnCollection   
   Try   
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)   
   Catch   
     ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, Cancel)   
     areInputColumnsValid = False   
     Return DTSValidationStatus.VS_NEEDSNEWMETADATA   
   End Try   
 Next   
 Return DTSValidationStatus.VS_ISVALID   
End Function   
  
Public  Overrides Sub ReinitializeMetaData()   
 If Not areInputColumnsValid Then   
   Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)   
   Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput   
   For Each column As IDTSInputColumn100 In input.InputColumnCollection   
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)   
     If vColumn Is Nothing Then   
       input.InputColumnCollection.RemoveObjectByID(column.ID)   
     End If   
   Next   
   areInputColumnsValid = True   
 End If   
End Sub