2012-02-27 62 views
1

我有關於WebSphere MQ隊列的數據。我寫了一個腳本任務來讀取數據,並且可以將它輸出到一個變量或文本文件。但我想用它作爲數據流步驟的輸入並轉換數據。最終目的地是一個平面文件。SSIS:如何讀取WebSphere MQ,轉換並寫入平面文件?

有沒有辦法讀取變量作爲數據流步驟中的源?我可以將MQ數據寫入文本文件,然後讀取數據流中的文本文件,但這看起來像是很多開銷。或者我可以跳過數據流altogther,並將所有轉換寫入腳本(但是爲什麼還要首先使用SSIS?)

有沒有辦法將原始文件寫出腳本步驟,以便通過進入數據流組件?

任何想法讚賞!

回答

2

如果您已經獲得了使用web服務的腳本,則可以跳過所有中間輸出並將其用作數據流中的源代碼。

將數據流任務拖動到畫布上並添加腳本組件。而不是選擇轉換(最後一個選項),請選擇Source

雙擊腳本組件並選擇Input and Output Properties。在「輸出0」下,選擇「輸出列」,然後單擊「Add Column」以查看Web服務具有的許多列。適當命名它們並確保正確定義它們的元數據。

定義列後,單擊回到腳本選項卡,選擇您的語言並編輯腳本。將所有可能編寫的代碼都用於服務,我們將在此處使用它。

CreateNewOutputRows方法中,您將需要遍歷Websphere MQ請求的結果。對於返回的每一行,您將應用以下模式。

public override void CreateNewOutputRows() 
{ 
    // TODO: Add code here or in the PreExecute to fill the iterable object, mqcollection 

    foreach (var row in mqcollection) 
    { 
     // Adds a new row into the downstream buffer 
     Output0Buffer.AddRow(); 

     // Assign all the data to the correct locations 
     Output0Buffer.Column = row.Column; 
     Output0Buffer.Column1 = row.Column1; 

     // handle nulls appropriately 
     if (string.IsNullOrEmpty(row.Column2)) 
     { 
      Output0Buffer.Column2_IsNull = true; 
     } 
     else 
     { 
      Output0Buffer.Column2 = row.Column2; 
     } 
    } 
} 

必須通過_IsNull屬性或你的腳本將炸燬處理空值。這是繁瑣的工作而不是正常的來源,但與轉儲到磁盤或其他分段機制相比,您將更有效率,更快速並消耗更少的資源。

+0

這正是我所期待的。非常感謝您的詳細解釋! – DZx 2012-02-27 15:43:35

+0

如果你覺得這個和其他答案很有用,你可以點擊問題旁邊的向上箭頭。如果這解決了您的問題,您也可以單擊複選標記以表示問題已得到解答。 – billinkc 2012-02-27 16:05:54

0

嘗試使用MA01 MQ supportpac中的Q程序,而不是腳本。

+0

感謝您的帖子,cschneid。我將使用腳本組件作爲源代碼,因爲我認爲這是我最簡單的路線。 – DZx 2012-02-27 15:45:31

1

因爲我遇到了一些額外的「陷阱」,我想我會發布我的最終解決方案。

我使用的腳本不調用Web服務,而是直接連接並讀取WebSphere隊列。但是,爲了做到這一點,我必須添加對amqmdnet.dll的引用。

您可以參考的腳本任務(它位於控制流畫布上),而不是一個腳本組件(也就是數據流的一部分)添加。

所以我有一個腳本任務,引用和代碼來讀取隊列的內容。隊列中的每一行都只是一個固定寬度的記錄,並且每一行都被添加到一個List中。最後,列表被放入在包級別聲明的讀/寫對象變量。

腳本輸入數據流任務。數據流的第一個組件是一個腳本組件,按照上面的billinkc描述的那樣創建爲源。該腳本將對象變量轉換回列表。然後將列表中的每個項目分析到輸出緩衝區中的字段。 各種拆分和變換任務從那裏接管。