容器
容器是ssis為乙個或多個任務提供一種結構的物件。例如可以執行乙個迴圈直到到達邊界條件,或者將一系列的task按邏輯組織在一起。乙個容器也可以包含其他的容器。容器和任務(task)一樣也放在control flow標籤內,總共有四種型別的容器:任務宿主task host,sequence序列,for迴圈和foreach迴圈。
任務宿主task host containers
任務宿主是單個task的預設容器,你在工具欄中找不到這種工具的圖示,實際上即使不選擇乙個容器,單個task仍然包含在乙個任務宿主中。ssis的結構通過任務宿主來擴充套件變數和事物控制。
sequence容器
sequence容器可以處理package中的子任務,將package劃分成更容易控制的小片段。下面是sequence容器的一些應用:
在工具欄的control flow中拖放乙個sequence容器,如圖4-1,左邊是乙個sequence容器,包含兩個task,右邊是乙個foreach迴圈容器,左邊容器中的task執行成功之後才能執行右邊容器中的task。
圖4-1
for迴圈容器
for迴圈容器像其他程式語言一樣,是一種建立迴圈方法的任務。在這種迴圈中ssis設定乙個初始值,在迴圈中不斷地重新賦值,只到不滿足邊界條件。
雙擊開啟for迴圈容器的編輯頁面如圖4-2。initexpression選擇項設定迴圈的初始條件。evalexpression選擇項是每次迴圈都會重新賦值的,一旦它變成false,迴圈將停止。assignexpression可以在每次迴圈時都改變表示式的值。
圖4-2
現在來試驗乙個迴圈容器的用法,在這個例子中將試驗在迴圈中五次執行一段指令碼,這是乙個很簡單的例子,可以新增一些其他功能。
建立乙個ssis專案,將預設的package更名為forloop.dtsx
開啟這個package,川建乙個新的變數counter,在面板中右擊選擇variables,點選新增變數按鈕,預設變數型別為int32
從工具箱中拖放乙個loop迴圈容器,雙擊開啟編輯頁面,設定initexpression為@counter = 0,迴圈開始時變數counter的值設定為0,evalexpression選項設定為@counter < 5 and @counter = @counter + 1,在滿足條件@counter<5是迴圈一直執行,並自加1,在name選項中輸入iterate through a script,最後如圖4-3
在這個loop迴圈容器中拖放乙個指令碼任務,雙擊這個指令碼任務,取名為pop up the iteration
在指令碼任務的編輯頁面如圖4-4,在readonlyvariables選項中輸入counter,向任務傳入乙個引數變數
點選design script,開啟visual studio編輯環境,在mian()方法體內輸入下面的**,**根據變數彈出對話方塊顯示counter變數的值
public sub main()注:vs2008環境內部分**是dts.taskresult = scriptresults.successdim variables as variables
if dts.variables.contains("counter") = true then
dts.variabledispenser.lockoneforread("counter", variables)
end if
msgbox("you are in iteration: " & cstr(variables("counter").value))
dts.taskresult = dts.results.success
end sub
退出visual studio編輯環境,回到原來的編輯介面,執行這個package結果如圖4-5,會出現5個彈出框,從0到4,task的顏色變成綠色,然後右變成黃色。最終執行完之迴圈後又變成綠色。
圖4-3
圖4-4
foreach迴圈容器
foreach迴圈容器是乙個很強大的容器,它可以對物件集合進行迴圈操作。在迴圈操作的過程中取得物件集合中相關值,物件集合的型別可以是檔案等,在下面列舉。還可以將物件集合中的值對映到變數中。物件的型別根據標籤collection中enumerator屬性的設定不同,這些屬性如下:
我們來做乙個和for迴圈容器類似的例子,在這個例子中我們將列舉乙個資料夾下的所有檔案,使用對話方塊輸出檔案的名字資訊。
新建乙個專案,將預設包重新命名為foreachloop.dtsx
拖拽乙個foreach迴圈容器,雙擊開啟編輯介面,在general標籤內將它重新命名為iterate through files
在collection標籤內,報紙enumerator屬性預設值foreach file enumerator,設定folder屬性內選擇乙個檔案較少的資料夾,這個例子不會修改檔案,只是讀出檔案的相關資訊,在files選項內保持預設值「.」,最後的介面如圖4-5
轉到變數對映標籤頁面內,在變數列內選擇,開啟新增變數對話方塊。為變數命名filename,在index列內變數的值預設0,因為只對乙個資料夾下的檔案迴圈操作,所以保持預設值0不變,點選ok退出編輯介面
拖放乙個指令碼任務放置到foreach迴圈容器中,雙擊開啟編輯介面重新命名為read files
轉到script標籤,在readonlyvariale屬性內設定變數filename,點選design開啟visual studio編輯環境,使用下面**代替main()方法體內的**
public sub main()注:vs2008環境內部分s**是dts.taskresult = scriptresults.successdim variables as variables
if dts.variables.contains("counter") = true then
dts.variabledispenser.lockoneforread("counter", variables)
end if
msgbox("you are in iteration: " & cstr(variables("counter").value))
dts.taskresult = dts.results.success
end sub
7. 點選ok退出編輯介面,執行這個package得到的結果如圖4-6(彈出內容根據具體設定不同而不同)
圖4-6
圖4-7
SSIS中的容器和資料流 資料目的
在data flow中destination從資料來源或者資料處理流程中接收資料。在ssis中資料可以匯入到任何ole db支援的資料來源,平面檔案或者analysis service中的資料。和資料來源一樣destinations也通過連線管理器來連線,不同之處是有乙個資料對映介面如圖4 11。圖...
結構體和資料流的轉換
結構體轉byte陣列 1 首先要明白 是 在那個命名空間下 system.runtime.interopservices 2 首先得到結構體的大小 2 開闢相應的記憶體空間 3 將結構體填充進開闢的記憶體空間 4 從記憶體空間拷貝進byte陣列 5 不要忘記釋放記憶體哦 public static ...
資料流中的中位數python 資料流中的中位數
python用的自己實現的最大和最小堆的class,getmedian需要加個引數,否則python版會報錯。coding utf 8 最小堆 class minheap def init self self.minheap def len self return len self.minheap ...