none
Spaltenwert mit Skriptkomponente auslesen RRS feed

  • Frage

  • Hallo,
    in der Skriptkomponente-VisualBasic (SK) werden doch Spalten-Eigenschaften automatisch erstellt (BufferWrapper.vb). Dadurch ist es möglich mittels ROW.Spaltenname den Wert der Spalte auszugeben z.B. ROW.ErrorColumn für eine Spalten-ID. Ich suche nach einer Möglichkeit  in SK den Spaltenwert zu ermitteln, wobei der Name der Spalte oder ggf. ein Spalten-ID erst in "Eingabe0_ProcessInputRow(ByVal Row As Eingabe0Buffer)" ermittelt wird. Habe bereits mit IDTSComponentMetaData100, IDTSBufferManager100 u.a. experimentiert. Leider ohne Erfolg. Hat jemand das Wissen, welche Komponente die richtige ist (ggf. Lösungsansatz)
    Danke!

    • Bearbeitet Script001 Mittwoch, 22. Oktober 2014 15:22
    Mittwoch, 22. Oktober 2014 15:12

Alle Antworten

  • Hallo,

    wenn ich Dich richtig verstanden habe, willst Du per Indexer auf die Spaltenwerte zugreifen, also z.B. mit dem Wert 5 auf die 5te Spalte zugreifen?

    Die Standard-Implementierung der generierten InputXBuffer Klasse gibt es die Möglichkeit nicht. Du könntest die Klasse anpassen, um über den Index/Namen die Werte anzurufen, aber: Not supported und bei jeder Änderung an der Skript Komponente warden Deine Änderungen überschrieben.

    Die Anpassung an der "BufferWrapper.vb" können so aussehen (Anpassung in fett):

    <CLSCompliant(False)> _
    Public Class Input0Buffer
        Inherits ScriptBuffer
    
        Public Sub New(ByVal Buffer As PipelineBuffer, ByVal BufferColumnIndexes As Integer(), ByVal OutputMap As OutputNameMap)
            MyBase.New(Buffer, BufferColumnIndexes, OutputMap)
        End Sub
    
        Public ReadOnly Property GetValue(ByVal index As Integer) As Object
            Get
                Return Buffer.Item(index)
            End Get
        End Property
    
        Public ReadOnly Property GetValue(ByVal name As String) As Object
            Get
                Return Buffer.Item(Me.BufferColumnIndexes(name))
            End Get
        End Property
    
        Public ReadOnly Property [value1]() As Int32
            Get
                Return Buffer.GetInt32(Me.BufferColumnIndexes(0))
            End Get
        End Property

    und in Deiner Skript Komponente kannst Du es so verwenden:

        Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
            Dim valueByIndex As Object = Row.GetValue(0)
            Dim valueByName As Object = Row.GetValue("Name")
        End Sub

    Aber wie gesagt: Ist nicht zu empfehlen, weil die Änderungen überschrieben werden können und Du den Vorteil verlierst mit typisierten Daten zu arbeiten.

    Leider ist die BufferWrapper Klasse nicht als wie sonst üblich als Partial ausgelegt, sonst könnte man seine Anpassungen in eine eigene auslagern.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 22. Oktober 2014 16:58