這個範例是提供給一位網友的參考解決方案

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

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

小弟與該位網友溝通了解後,大致上做了一個類似他想要的做法,在此提供給大家參考

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

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

image

public bool TestServices(string str)
      {
          bool flag = false;
          if (str == "我是假的xml字串")
              flag = true;

          return flag;
      }


然後回到ssis

先建立幾個變數

image

變數的用意我說明一下

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

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

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


接下來..

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

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

image

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

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

image

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

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

image

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

image

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

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

image

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

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

image

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

image

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

image

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

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

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

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

image

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

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

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

image

設定完後按確定

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

image

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

image

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

image

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

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

image

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

image

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

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

image

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

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

image

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


接下來重點來囉!…

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

image

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

image

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

在readonlyavariables中輸入returnbool

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

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

其實一般的作法應該


image 























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

image

‘宣告一個xmldatadocument類別

Dim xmldoc As New Xml.XmlDataDocument

‘宣告一個記憶體串流變數,這裡的變數,填的是returnbool

       Dim strm As New System.IO.MemoryStream(Text.UnicodeEncoding.Unicode.GetBytes(Dts.Variables("returnbool").Value.ToString()))

‘讀取這個記憶體串流
       xmldoc.Load(strm)

       Dim x As String = String.Empty

‘依xml的childnodes逐列讀取
       For i As Integer = 0 To xmldoc.DocumentElement.ChildNodes.Count - 1
           x = xmldoc.DocumentElement.ChildNodes(i).Value

'以下這一行是表示只讀某個欄位名稱的內容,不過因為我的範例 xml結果沒有回傳多個節點的內容,所以我不用下面的方式
           '   x = xmldoc.DocumentElement.ChildNodes(i)("RefKey").Value

       Next

‘將結果寫到insertval變數中
       Dts.Variables("insertval").Value = x


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

image

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

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


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

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

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

image

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

image

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

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

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

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

image

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

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

image

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

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

image 

ok,來執行看看吧

成功的執行完囉!

image

來看一下table的結果吧

有值囉!

image

好了,到此全部說明完啦

有問題的話,再提出來討論吧,就先這樣子囉,好長的一篇教學啊擦汗.gif ,打字打的好累..

 

arrow
arrow
    全站熱搜

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