SSIS-將自行產生的資料傳入Web Service,並接收回傳結果寫到DB的範例

SSIS-將自行產生的資料傳入Web Service,並接收回傳結果寫到DB的範例

該案例希望的訴求是將自己從資料庫中組好的xml資料字串傳入到一個web services

並將web servies回傳的結果中的某些欄位寫到資料庫中

ok,做這個範例的準備工作如下

首先:我自己先用vs2008的一個web 專案做了一個web services,以便模擬當傳入web services後,要傳回個結果

clip_image001

 

		   1: public bool TestServices(string str)
		   2:       {
		   3:           bool flag = false;
		   4:           if (str == "我是假的xml字串")
		   5:               flag = true;
		   6:  
		   7:           return flag;
		   8:       }
		   9:  

然後回到ssis

先建立幾個變數

clip_image002

變數的用意我說明一下

returnbool:是接收web servies的回傳字串結果,我放在這個變數

rs:是到時候放我從資料庫中撈資料處理後,準備要依資料筆數逐筆處理用的

str:使用”foreach迴圈”控制項時會用的到的變數

接下來..

資料來源:我假設我是讀某一個資料表的資料,其實我只是要筆數,因為實際上的組字串,我就不做了,因為那個不是重點

首先拉一個”資料流程工作”元件

clip_image003

在資料流程工作按獲鼠右鍵,選編輯

拉出一個ole db 來源,假設資料從資料庫來

clip_image004

我設定的oledb連接管理是連sql server,其實這裡沒差,看你自己是連什麼樣的資料庫

只是為了範例方便,我先預覽給大家看,我假定的資料來源內容

clip_image005

切換到”資料行”頁籤,我是只有選擇我想要用的欄位即可,其他的就不用選了,這樣也可以提昇處理效率及節省記憶體空間哦,最好的做法當然是在下sql 命令時,只select自己想要的欄位即可,這樣ssis這邊就不用改了

clip_image006

接下來若中間,你們有自己做一些處理,轉換的,就自己弄一弄嘿..

我用最簡單的範例,就是中間都不做處理,直接輸出結果

clip_image007

綠線連接起來後,在”資料錄集目的地”按滑鼠右鍵,選編輯

在元件屬性的頁籤中,選擇之前我們設定的變數”rs”

clip_image008

切換到”輸入資料行”頁籤,我只要輸出一個欄位,確定無誤後,按”確定”關閉此元件頁面

clip_image009

接下來回到”控制流程”頁,拉出一個”foreach迴圈”元件

clip_image010

在”foreach迴圈”上按滑鼠鍵,選編輯

切換到”集合”頁籤,在enumerator這裡選擇”foreach ado列舉值”這個項目

接下來在ado物件來源變數選擇變數”rs”

這裡選這個是為了去跑rs這個資料集中共有幾筆,他就會跑幾次

clip_image011

接下來再切換到”變數對應”這個頁籤,這裡我選擇”str”這個變數來接收資料集中name欄位的值

索引的意思是說,這個變數要接的是你在資料流程中的”資料錄集目的地”中的那一個欄位順序,0表示第一個欄位

因為我們也只有傳回一欄,所以索引要設0

clip_image012

設定完後按確定

然後再拉一個”web 服務工作”到”foreach 迴圈容器中”

clip_image013

在”web 服務工作”按滑鼠右鍵,選編輯

clip_image014

先新增一條連接,輸入你的wsdl,按測試連接看看是否成功,這裡不成功的話,就不用往下做了,要先測過哦

clip_image015

接下來我們必須要新增一個wsdl檔案,不管放哪都可以,例如我先在檔案總管中的d:下,建立一個文字檔,然把把檔名改成test.wsdl,這樣就可以了

接下來回到ssis中,繼續在”web 服務工作”中的wsdlfile中選擇你的檔案

clip_image016

接下來按下下載wsdl,記得overwritewsdlfile這個選項要設成true,雖然只下載一次,但以後若內容有變的話,就不要手動改了

clip_image017

切換到”輸入”頁籤選擇你要做的function services名稱,下方的名稱指的是你要傳進去給web servces這個function的變數名稱

“值”這裡請選擇我們之前在ssis中設的變數名稱”str”

clip_image018

接下來切換到”輸出”頁籤

這裡的outputtype選擇”變數”,在variable的地方選擇我們要接收web services回傳的變數,這裡我選returnbool

clip_image019

好了,到此先喘回氣吧,設定很多哦

接下來重點來囉!…

拉出一個指令碼工作,如下圖所示,記得要放在”foreach 迴圈容器中”

clip_image020

接下來我們再新增一個ssis的全域變數 ,叫做insertval,類型為string

clip_image021

接下來編輯”指令碼工作”這個內容

在readonlyavariables中輸入returnbool

在readwritevariables中輸入insertval這個變數名稱,因為我們要將webservices傳回來的xml字串改掉成我們要的結果內容

這裡我只是寫一個變數,當你是多個時,用逗號隔開即可,例如 var1,var2

其實一般的作法應該

clip_image022

進到指令碼編輯畫面後,在main()中輸入程式碼如下

clip_image024

 

		   1: ‘宣告一個xmldatadocument類別
		   2:  
		   3: Dim xmldoc As New Xml.XmlDataDocument
		   4:  
		   5: ‘宣告一個記憶體串流變數,這裡的變數,填的是returnbool
		   6:  
		   7:        Dim strm As New System.IO.MemoryStream(Text.UnicodeEncoding.Unicode.GetBytes(Dts.Variables("returnbool").Value.ToString()))
		   8:  
		   9: ‘讀取這個記憶體串流
		  10:        xmldoc.Load(strm)
		  11:  
		  12:        Dim x As String = String.Empty
		  13:  
		  14: ‘依xml的childnodes逐列讀取
		  15:        For i As Integer = 0 To xmldoc.DocumentElement.ChildNodes.Count - 1
		  16:            x = xmldoc.DocumentElement.ChildNodes(i).Value
		  17:  
		  18: '以下這一行是表示只讀某個欄位名稱的內容,不過因為我的範例 xml結果沒有回傳多個節點的內容,所以我不用下面的方式
		  19:            '   x = xmldoc.DocumentElement.ChildNodes(i)("RefKey").Value
		  20:  
		  21:        Next
		  22:  
		  23: ‘將結果寫到insertval變數中
		  24:        Dts.Variables("insertval").Value = x
		  25:  

用debug 模式來看我接到的web services回傳值如下

clip_image026

所以我接的字串其實是true這個值而已

因此預期insertval的值應該只會是”true”這樣

好了到此就算是完成一大半了,接下來就是要到資料庫了

我先建立一個測試的資料表叫做test3,只有二個欄位

當然我也是以sql server做為我測試的db,以下為test3的schema

clip_image027

接下來回到ssis中,再拉出一個”執行sql工作”的元件

clip_image028

在”執行 sql 工作”,按滑鼠右鍵選編輯

我在一般的頁籤中,設定我的connection為我的共用資料來源”demodb”

在sqlstatement中輸入下列sql 語法 insert into test3 values(getdate(),?)

“?”指的是我要輸入的參數

clip_image029

接下來切換到”參數對應”

在變數名稱我選擇insertval,資料類別我選varchar,參數名稱我輸入0,這裡也是一樣有順序之別

clip_image030

好了,終於設完了來執行看看吧

我們先來看一下這個table的內容,目前是沒有資料的

clip_image031

ok,來執行看看吧

成功的執行完囉!

clip_image032

來看一下table的結果吧

有值囉!

clip_image033

好了,到此全部說明完啦