公告版位
哈囉,丫德我會常常更新一些工作上的心情記事及資訊科技新知與大家分享...

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

該案例希望的訴求是將自己從資料庫中組好的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 ,打字打的好累..

 

創作者介紹

信德隨想

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


留言列表 (1)

發表留言
  • 小毛
  • 嗨板主大
    天阿..真是辛苦您了 Orz
    這麼複雜的東西您居然這麼快就做出了
    真是佩服佩服 Q_Q
    我來試試看 有好消息或新發現再跟您分享喔
    感謝感謝!!
  • ok,祝你順利嘿..

    丫德 於 2009/02/19 15:12 回覆