專案上有遇到客戶只有提供web services,我們只能接web services的資料下來,當做轉檔的資料來源
我想應該也有很多人有這樣的需求吧..
以下的教學,是實際發生的案例,如果已經會在ssis中使用web services的達人們,就可以不用看囉!
這次的案例很簡單
只是純粹做資料同步,什麼意思呢?也就是說資料其實都在客戶端輸入,但我們這邊也要同步備份他們其中的一個資料表的內容,以便做後續的處理
因此我們請客戶提供一個web services,然後我們接收他的資料來做同步..
首先在ssis的控制流程中拉出一個"web 服務工作"的控制項
接下來請新增兩個全域變數
第一個itexchds是接收web services用的
第二個viewds是測試時用的,後面會講到..
接下來請在"一般"頁籤的,httpconnection中新增一個連接
接下來在下圖的 伺服器url的地在輸入你們要接收的web services網址,假設我的webservices的name叫做test.asmx
例如:http://www.test.com.tw/TestWeb/Service/Test.asmx?WSDL
測試成功後,下一步就是要做一個wsdlfile的接收目的檔
你可以在以後要發行ssis的dtsx的地方,先建一個空的xxx.wsdl檔案(ps:xxx指的是你自己想命名的主檔名,建議可以用記事本建立,改掉副檔名就可以了),因為待會兒我們要指定wsdlfile,而這個檔案必須先存在,建立成功後,回到"web 服務工作"控制項的設定畫面
在wsdlfile選擇剛才建立好的空的test.wsdl檔案,然後點"下載wsdl"
為什麼呢?我說明一下,如果是在測試時,你可以指到任何地方都可以,但如果屆時要執行這個dtsx時,就要考慮這個wsdl要放在哪?
建議是跟發行dtsx後的地方放在一起,那在指定wsdlfile的時候,就指到發行位置的xxx.wsdl這個檔案,這樣發行後也就不會發行找不到檔案的問題
接下來切換到輸入頁籤
在services的地方選擇要執行的web services name,這個地方,必須在前面的"一般"頁籤中有執行"下載wsdl",才會選的到哦,不然是空的會沒得選
在method的地方選擇該web services中的function
接下來切換到"輸出"頁籤
在outputtype的地方選擇"變數"
在variable的地方選擇之前所設定的變數名稱,我自己是設itexchds,那看倌就依你們自訂的變數名稱來設定吧
完成後,按確定關閉視窗
接下來,拉出一個"資料流程工作"
在"資料流程工作"上點選滑鼠右鍵選編輯
接下來,拉出一個指令碼元件
為什麼在這裡不是選資料流程來源中的控制項,因為ssis的資料流程來源沒有提供接變數當作資料來源的部份
可以接變數當作資料來源的只有"指令碼元件"控制項,所以我們要選這個
拉出後,會再彈一個視窗,請選擇"來源",如下圖,選完後,按確定
接下來在"指令碼元件"中按滑鼠右鍵選編輯
在"輸入及輸出"的頁籤中,請照下圖操作,畫面上有看到四個輸出資料行,那是我這邊demo的範例
這裡要加入資料行指的是你從web services接下來後的欄位名稱有些哪,要自行輸入(比較麻煩的在這個地方,欄位多的話,那就當做練打字吧,哈)
記得一定要指定欄位的型別及長度哦
接下來在切換到"指令碼"的頁籤
在readonlyvariables的地方輸入itexchds,這個變數也就是在之前設定為接web services資料的變數名稱,打上去之後,接下來請點選設計指令碼
接下來會開啟編輯程式碼的視窗如下
記得加入一個system.xml.dll的參考
接下來在CreateNewOutputRows()的function中輸入如下的程式碼
'-------------------------------------------------------------------------------------------------------------------
Dim i As Integer
Dim xmldoc As New Xml.XmlDataDocument
Dim strm As New System.IO.MemoryStream(Text.UnicodeEncoding.Unicode.GetBytes(Me.ReadOnlyVariables("itexchds").Value.ToString()))
xmldoc.DataSet.ReadXml(strm)
For i = 0 To xmldoc.DataSet.Tables(0).Rows.Count - 1
With 輸出0Buffer
.AddRow()
.chym = CType(xmldoc.DataSet.Tables(0).Rows(i)("ch_ym"), String)
.currency = CType(xmldoc.DataSet.Tables(0).Rows(i)("currency"), String)
.exchrate = CType(xmldoc.DataSet.Tables(0).Rows(i)("exch_rate"), Integer)
Try
.currname = CType(xmldoc.DataSet.Tables(0).Rows(i)("curr_name"), String)
Catch ex As Exception
.currname = System.String.Empty
End Try
End With
Next
輸出0Buffer.EndOfRowset()
'-------------------------------------------------------------------------------------------------------------------
程式碼中的輸出0buffer這個名稱指的是你在"輸入及輸出"頁籤中所定義的名稱,預設為"輸出0",如果你有換掉,則我的程式碼,你也要改掉
中間那一段
.chym = CType(xmldoc.DataSet.Tables(0).Rows(i)("ch_ym"), String)
.currency = CType(xmldoc.DataSet.Tables(0).Rows(i)("currency"), String)
.exchrate = CType(xmldoc.DataSet.Tables(0).Rows(i)("exch_rate"), Integer)
指的是你web services接收下來的欄位,你有哪些是要使用的,需要使用的就要打上去
Try
.currname = CType(xmldoc.DataSet.Tables(0).Rows(i)("curr_name"), String)
Catch ex As Exception
.currname = System.String.Empty
End Try
這一段是判斷如果接收下來的欄位內容有null值的話,而接收的欄位又是string的話,就要放System.String.Empty,不然執行時會失敗,若完成後,按確定
接下來的動作,只是要測試資料是否真的有下來,所以我們"資料錄集目的地"的方式測試查看,實際上run的話,就看各位看倌要怎麼接,你也可以拉"oledb目的地"把資料寫到資料庫中,但建議最好是先放到"資料錄集目的地"中測試一下看看,ok 的話再換掉比較好
所以請在"資料流程目的地"中拉出"資料錄集目的地",並把綠線連起來,如下圖所示
接下來在"資料錄集目的地"點滑鼠右鍵,選編輯在variablename中選擇之前建立的變數viewds,當做呈現的資料集
接下來切換到"輸入資料行"頁籤,將想要看的欄位勾選起來
接下來,請在綠線上按滑鼠右鍵選編輯,設定一個資料檢視器,不會的話,請參考SSIS-使用變數來下sql,這篇文章的最下方有說明如何設定,我就不再多加描述了
執行結果,因為資料是需要保密的不能呈現,所以用馬賽克..,但結論是資料是有接收到的..
在ssis中接web servcies是可以做的到,但要設定的地方也是很多,希望這篇文章可以幫助到需要的人
有問題請留言,或留下迴響討論囉
留言列表