SSIS-將自行產生的資料傳入Web Service,並接收回傳結果寫到DB的範例
該案例希望的訴求是將自己從資料庫中組好的xml資料字串傳入到一個web services
並將web servies回傳的結果中的某些欄位寫到資料庫中
ok,做這個範例的準備工作如下
首先:我自己先用vs2008的一個web 專案做了一個web services,以便模擬當傳入web services後,要傳回個結果
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
先建立幾個變數
變數的用意我說明一下
returnbool:是接收web servies的回傳字串結果,我放在這個變數
rs:是到時候放我從資料庫中撈資料處理後,準備要依資料筆數逐筆處理用的
str:使用”foreach迴圈”控制項時會用的到的變數
接下來..
資料來源:我假設我是讀某一個資料表的資料,其實我只是要筆數,因為實際上的組字串,我就不做了,因為那個不是重點
首先拉一個”資料流程工作”元件
在資料流程工作按獲鼠右鍵,選編輯
拉出一個ole db 來源,假設資料從資料庫來
我設定的oledb連接管理是連sql server,其實這裡沒差,看你自己是連什麼樣的資料庫
只是為了範例方便,我先預覽給大家看,我假定的資料來源內容
切換到”資料行”頁籤,我是只有選擇我想要用的欄位即可,其他的就不用選了,這樣也可以提昇處理效率及節省記憶體空間哦,最好的做法當然是在下sql 命令時,只select自己想要的欄位即可,這樣ssis這邊就不用改了
接下來若中間,你們有自己做一些處理,轉換的,就自己弄一弄嘿..
我用最簡單的範例,就是中間都不做處理,直接輸出結果
綠線連接起來後,在”資料錄集目的地”按滑鼠右鍵,選編輯
在元件屬性的頁籤中,選擇之前我們設定的變數”rs”
切換到”輸入資料行”頁籤,我只要輸出一個欄位,確定無誤後,按”確定”關閉此元件頁面
接下來回到”控制流程”頁,拉出一個”foreach迴圈”元件
在”foreach迴圈”上按滑鼠鍵,選編輯
切換到”集合”頁籤,在enumerator這裡選擇”foreach ado列舉值”這個項目
接下來在ado物件來源變數選擇變數”rs”
這裡選這個是為了去跑rs這個資料集中共有幾筆,他就會跑幾次
接下來再切換到”變數對應”這個頁籤,這裡我選擇”str”這個變數來接收資料集中name欄位的值
索引的意思是說,這個變數要接的是你在資料流程中的”資料錄集目的地”中的那一個欄位順序,0表示第一個欄位
因為我們也只有傳回一欄,所以索引要設0
設定完後按確定
然後再拉一個”web 服務工作”到”foreach 迴圈容器中”
在”web 服務工作”按滑鼠右鍵,選編輯
先新增一條連接,輸入你的wsdl,按測試連接看看是否成功,這裡不成功的話,就不用往下做了,要先測過哦
接下來我們必須要新增一個wsdl檔案,不管放哪都可以,例如我先在檔案總管中的d:下,建立一個文字檔,然把把檔名改成test.wsdl,這樣就可以了
接下來回到ssis中,繼續在”web 服務工作”中的wsdlfile中選擇你的檔案
接下來按下下載wsdl,記得overwritewsdlfile這個選項要設成true,雖然只下載一次,但以後若內容有變的話,就不要手動改了
切換到”輸入”頁籤選擇你要做的function services名稱,下方的名稱指的是你要傳進去給web servces這個function的變數名稱
“值”這裡請選擇我們之前在ssis中設的變數名稱”str”
接下來切換到”輸出”頁籤
這裡的outputtype選擇”變數”,在variable的地方選擇我們要接收web services回傳的變數,這裡我選returnbool
好了,到此先喘回氣吧,設定很多哦
接下來重點來囉!…
拉出一個指令碼工作,如下圖所示,記得要放在”foreach 迴圈容器中”
接下來我們再新增一個ssis的全域變數 ,叫做insertval,類型為string
接下來編輯”指令碼工作”這個內容
在readonlyavariables中輸入returnbool
在readwritevariables中輸入insertval這個變數名稱,因為我們要將webservices傳回來的xml字串改掉成我們要的結果內容
這裡我只是寫一個變數,當你是多個時,用逗號隔開即可,例如 var1,var2
其實一般的作法應該
進到指令碼編輯畫面後,在main()中輸入程式碼如下
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回傳值如下
所以我接的字串其實是true這個值而已
因此預期insertval的值應該只會是”true”這樣
好了到此就算是完成一大半了,接下來就是要到資料庫了
我先建立一個測試的資料表叫做test3,只有二個欄位
當然我也是以sql server做為我測試的db,以下為test3的schema
接下來回到ssis中,再拉出一個”執行sql工作”的元件
在”執行 sql 工作”,按滑鼠右鍵選編輯
我在一般的頁籤中,設定我的connection為我的共用資料來源”demodb”
在sqlstatement中輸入下列sql 語法 insert into test3 values(getdate(),?)
“?”指的是我要輸入的參數
接下來切換到”參數對應”
在變數名稱我選擇insertval,資料類別我選varchar,參數名稱我輸入0,這裡也是一樣有順序之別
好了,終於設完了來執行看看吧
我們先來看一下這個table的內容,目前是沒有資料的
ok,來執行看看吧
成功的執行完囉!
來看一下table的結果吧
有值囉!
好了,到此全部說明完啦