專案上有遇到客戶只有提供web services,我們只能接web services的資料下來,當做轉檔的資料來源

我想應該也有很多人有這樣的需求吧..

以下的教學,是實際發生的案例,如果已經會在ssis中使用web services的達人們,就可以不用看囉!

這次的案例很簡單

只是純粹做資料同步,什麼意思呢?也就是說資料其實都在客戶端輸入,但我們這邊也要同步備份他們其中的一個資料表的內容,以便做後續的處理

因此我們請客戶提供一個web services,然後我們接收他的資料來做同步..

首先在ssis的控制流程中拉出一個"web 服務工作"的控制項

image

接下來請新增兩個全域變數

第一個itexchds是接收web services用的

第二個viewds是測試時用的,後面會講到..

image

接下來請在"一般"頁籤的,httpconnection中新增一個連接

image

接下來在下圖的 伺服器url的地在輸入你們要接收的web services網址,假設我的webservices的name叫做test.asmx

例如:http://www.test.com.tw/TestWeb/Service/Test.asmx?WSDL

image

測試成功後,下一步就是要做一個wsdlfile的接收目的檔

你可以在以後要發行ssis的dtsx的地方,先建一個空的xxx.wsdl檔案(ps:xxx指的是你自己想命名的主檔名,建議可以用記事本建立,改掉副檔名就可以了),因為待會兒我們要指定wsdlfile,而這個檔案必須先存在,建立成功後,回到"web 服務工作"控制項的設定畫面

在wsdlfile選擇剛才建立好的空的test.wsdl檔案,然後點"下載wsdl"

image


為什麼呢?我說明一下,如果是在測試時,你可以指到任何地方都可以,但如果屆時要執行這個dtsx時,就要考慮這個wsdl要放在哪?

建議是跟發行dtsx後的地方放在一起,那在指定wsdlfile的時候,就指到發行位置的xxx.wsdl這個檔案,這樣發行後也就不會發行找不到檔案的問題

接下來切換到輸入頁籤

在services的地方選擇要執行的web services name,這個地方,必須在前面的"一般"頁籤中有執行"下載wsdl",才會選的到哦,不然是空的會沒得選

在method的地方選擇該web services中的function

image

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

在outputtype的地方選擇"變數"

在variable的地方選擇之前所設定的變數名稱,我自己是設itexchds,那看倌就依你們自訂的變數名稱來設定吧

完成後,按確定關閉視窗

image

接下來,拉出一個"資料流程工作"

image

在"資料流程工作"上點選滑鼠右鍵選編輯

接下來,拉出一個指令碼元件

為什麼在這裡不是選資料流程來源中的控制項,因為ssis的資料流程來源沒有提供接變數當作資料來源的部份

可以接變數當作資料來源的只有"指令碼元件"控制項,所以我們要選這個

image

拉出後,會再彈一個視窗,請選擇"來源",如下圖,選完後,按確定

image

接下來在"指令碼元件"中按滑鼠右鍵選編輯

在"輸入及輸出"的頁籤中,請照下圖操作,畫面上有看到四個輸出資料行,那是我這邊demo的範例

這裡要加入資料行指的是你從web services接下來後的欄位名稱有些哪,要自行輸入(比較麻煩的在這個地方,欄位多的話,那就當做練打字吧,哈)

記得一定要指定欄位的型別及長度哦

2009-2-16 下午 01-38-08.jpg  

接下來在切換到"指令碼"的頁籤

在readonlyvariables的地方輸入itexchds,這個變數也就是在之前設定為接web services資料的變數名稱,打上去之後,接下來請點選設計指令碼

image

接下來會開啟編輯程式碼的視窗如下

image

記得加入一個system.xml.dll的參考

image

image

接下來在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",如果你有換掉,則我的程式碼,你也要改掉

image

中間那一段

.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 的話再換掉比較好

所以請在"資料流程目的地"中拉出"資料錄集目的地",並把綠線連起來,如下圖所示

image

接下來在"資料錄集目的地"點滑鼠右鍵,選編輯在variablename中選擇之前建立的變數viewds,當做呈現的資料集

image

接下來切換到"輸入資料行"頁籤,將想要看的欄位勾選起來

image 

接下來,請在綠線上按滑鼠右鍵選編輯,設定一個資料檢視器,不會的話,請參考SSIS-使用變數來下sql,這篇文章的最下方有說明如何設定,我就不再多加描述了

image

執行結果,因為資料是需要保密的不能呈現,所以用馬賽克..,但結論是資料是有接收到的..

2008-12-16 下午 06-54-48

在ssis中接web servcies是可以做的到,但要設定的地方也是很多,希望這篇文章可以幫助到需要的人

有問題請留言,或留下迴響討論囉

 

arrow
arrow
    全站熱搜

    丫德 發表在 痞客邦 留言(13) 人氣()