2011年5月14日 星期六

在指令碼元件中寫回ReadWriteVariables中的變數

  情況是在資料流程中,我有一SQL命令(OLE DB來源),中間利用多重傳遞,產生三個副本寫到三個不同的資料表ABC(OLE DB目的地),三個資料表ABC幾乎只有幾個欄位上的差異,一次只會傳遞一筆資料到三個資料表
  三個目的資料表都有個InsuranceID欄位,但是只有資料表A是設成identity,資料表BC都沒有設,然後每次傳遞三個資料表的InsuranceID都要一樣才行,要不然前端程式會對應不到,所以在SQL命令中已使用( ident_current('資料表A')+1)先取得InsuranceID了,這樣產生的三個副本就都一致啦
  我想順便取得這次的InsuranceID欄位值,方便我將InsuranceID值Update到另一個資料表去,但是我不想再下一次SQL命令啦,想到說我可以再用一個副本,然後用指令碼元件去接那個欄位,寫入變數供之後使用,這是我想到可以不用再下一次SQL命令做法,不知還有更簡單的方法嗎?
  問題來了,我想說只要在指令碼元件中寫一行code就行了,結果出現如下錯誤
在 PostExecute 外部無法使用已被鎖定進行讀取和寫入的變數集合。
ReadWriteVariables的設定如下圖
  指令碼元件
  我的一行code如下紅字的部分,原來這樣一行是行不通的,這是錯誤示範
Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub 輸入0_ProcessInputRow(ByVal Row As 輸入0Buffer)
        Variables.InsuranceID = Row.InsuranceID.ToString
    End Sub
End Class

  原來BOL的在指令碼元件中使用變數有寫,擷取如下:
ReadWriteVariables 的集合只能在 PostExecute 方法中使用,才能最佳化效能並將鎖定衝突的風險降到最低。因此您無法在處理每一列資料時,直接增量封裝變數值。必須改增量區域變數值,並在處理所有的資料之後,將封裝變數值設定為 PostExecute 方法中的區域變數值。
  要拆成下面粉紅字那樣才行,先用區域變數接,在PostExecute方法中用封裝變數接回

Public Class ScriptMain
    Inherits UserComponent

    Dim v As String
    Public Overrides Sub 輸入0_ProcessInputRow(ByVal Row As 輸入0Buffer)
        v = Row.InsuranceID.ToString
    End Sub
    Public Overrides Sub PostExecute()
        Variables.InsuranceID = v
    End Sub

End Class

  最後BOL有提到效能問題,因為我這一次只轉一筆資料,這樣用沒這困擾

0 意見:

張貼留言