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

這篇文章是以SSIS-如何接收web services的資料當做資料來源做轉檔這篇文章為基礎來說,所以本篇看不懂的,可以先看一下該篇文章 web services設定的部份,本篇文章就不再重覆說明

至於為什麼要做本篇文章呢!因為SSIS-如何接收web services的資料當做資料來源做轉檔這篇文章是直接在”指令碼元件”中設定,算是比較進階的部份,且不好除錯,因此先用”指令碼工作”做驗証資料抓下來對不對,有沒有問題!

 

先確認單純執行該web services的元件是成功的!

如下圖

image

接著從工具列拉出一個”指令碼工作”的元件

image

在”指令碼工作”中接滑鼠右鍵選編輯,圖中紅框的部份,請輸入接收你web services的object變數(我這裡自己定義的變數名稱為rs)

image

接下來,點”編輯指令碼”,在main()中輸入如下程式碼

image

'宣告一個xml物件
       Dim xmldoc As New Xml.XmlDataDocument
       '宣告一個MemoryStream接收web servies的資料變數,我是定義為rs
       Dim strm As New System.IO.MemoryStream(Text.UnicodeEncoding.Unicode.GetBytes(Dts.Variables("rs").Value.ToString()))
       '讀取stream的資料到dtaset
       xmldoc.DataSet.ReadXml(strm)
       '執行中秀出msgbox顯示資料表的第1列的第1欄資料--正式時執行後,要mark掉,不然的一個彈msgbox
       MsgBox(xmldoc.DataSet.Tables(0).Rows(0)(0).ToString)
       '執行中秀出總共抓出共筆--正式時執行後,要mark掉,不然的一個彈msgbox
       MsgBox(xmldoc.DataSet.Tables(0).Rows.Count)

 

 

接下來關閉這個編輯視窗,回到控制流程,執行看看,以下為執行結果,可以看到的我目前指令碼工作還在執行中,並且秀出一個msgbox出來

image

第二個msgbox秀出你的web serices共回傳幾筆給你

image

這樣你就可以知道你抓web services的資料是否是正確的

 

 

如果到這邊都沒有問題才能繼續進行SSIS-如何接收web services的資料當做資料來源做轉檔這篇文章的部份

這樣,客倌您看的懂嗎?

若有問題可以給我迴響,大家來討論看看囉!

創作者介紹

信德隨想

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


留言列表 (15)

發表留言
  • 嘉
  • 先謝謝您不厭其煩的回答我的問題

    所以說你現在是卡在"找不到資料表0" 這個地方嗎?
    ---是的。但我照了您這篇文章的方法去試,還是出現了"找不到資料表0"這個問題。

    不然就是請你給我看一下你目前是怎麼做的畫面擷圖
    ---我已寄信到您指定的信箱了,麻煩您了。

    你們公司只有你在用ssis嗎?
    ---是的。

    謝謝
  • yangxinde
  • ok,我有空再看一下
  • 嘉
  • 我測出來為什麼會出現找不到資料表0的錯誤訊息了,因為web services所回傳的資料是string型態。所以得到的xml就變成以下的樣子:
    <?xml version="1.0" encoding="utf-16" ?>
    <string><root><sort_head sortno="SL-Test"/><sort_head sortno="sl333"/><sort_head sortno="SL-1222"/><sort_head sortno="SL-0904A"/><sort_head sortno="SL-0886"/><sort_head sortno="SL-0885"/><sort_head sortno="SL-0217"/></root></string>
    所以就使得xml變成非關聯式資料庫記錄的格式,以致於無法去使用DataSet類別的ReadXml方法進行讀取,因此才找不到資料表。
    但我目前還在找解決辦法。

    謝謝
  • 回傳是字串?那你可以將web services另copy成傳回為dataset的嗎?這樣你會比較方便做吧,至少你在資料處理上後續會比較快

    還可以可以讓我看一下你們web servies那裡的code是怎麼寫的呢?
    讓我可以模擬一下..,如果方便的話,煩請寄mail給我,謝謝嘍

    丫德 於 2009/02/17 17:55 回覆

  • 悄悄話
  • yangxinde
  • 給"嘉"
    恭禧您成功做出來了
    努力還是有結果的...
    看你成功,我也很高興
  • 小毛
  • 嗨板主大
    感謝您的訊息
    我也是最近在試SSIS弄得頭暈腦脹的= =

    我這邊的需求是將資料庫的檔案組成階層式的xml
    傳出給對方後 對方利用webservice回傳是否成功的訊息
    想請問您不知道有沒有試過這樣的一整個流程?
    create .xml的部分我這邊是ok的
    但就卡在不知如何在create一個xml檔案後 去call對方的webservice並把此檔案傳過去?
  • 小毛,你好
    嗯..我不太懂你的意思耶?
    你是說你要建立一個xml檔,然後要用呼叫web serices的方式,把檔案傳過去?
    還是是別的意思?
    你如果是要傳檔案的方式,你可以在ssis中呼叫mail來夾檔,或在ssis中用ftp的方式都可以傳過去,這樣你不是比較方便嗎?

    丫德 於 2009/02/18 17:34 回覆

  • 小毛
  • 您好
    是的 我已經用資料流程+程式碼元件 組好了一個.xml
    要把這個檔案的內容透過Call對方的WebService的方式來傳送 並接收它的FeedBack值
    流程類似Biztalk
    因為對方要求的process 所以沒辦法用mail的方式來做哩 :(
    好不容易把階層的xml組好了 這兩天一直試就是不知道該怎麼利用這個檔案內容
    去call對方的web service呢..

    p.s 參考您的方法設定Web服務元件 連線是成功的
  • 小毛你好
    請問一下,你組好的xml是已經產生一個實體檔案放在本機的磁碟下
    然後是要呼叫對方的web services的傳送?
    另外你說到,利用這個檔案的內容,呼叫web serices,這樣看實在是不了解你的意思?
    可否看一下你是怎麼設計你的ssis的,我是指目前,有畫面可以看一下嗎?
    如果方便的話,請寄到yangxindegmail .com

    丫德 於 2009/02/18 22:17 回覆

  • 小毛
  • 您好
    是產生實體檔案沒錯
    目前是在我的本機

    我是要做B2B的EDI所以利用到這個process
    簡單來說就是
    撈DB資料->組成xml格式->存成.xml (已完成)
    Call對方的Web Service->傳送.xml的內容->
    對方的WebService Feedback->success or fail
    -> 將回傳的訊息存回DB
    大概就是這樣
    只是實在不知道怎麼把.xml的內容透過WebService傳送並接收FeedBack..Orz
  • 那再問一下
    因為你說call對方的web serices
    那input什麼呢?string嗎?

    那你有用過Biztalk嗎?有些事ssis可能沒辦法做到哦
    用b2b還是用Biztalk做會比較適合
    兩者所應用的地方各有不同
    所以也無法取代對方
    ssis主要是做資料的轉換,整理,快速大量的複製資料
    但b2b的功能上,它並沒有Biztalk那麼強的功能
    所以你如果硬要用ssis來做,應該是很難做
    建議換個方向,Biztalk試看看

    丫德 於 2009/02/18 23:43 回覆

  • 小毛
  • 您好
    沒錯的 是input一長串的string
    也就是.xml裡的所有文字組成一個string丟過去
    他們會自己去判斷內容是否被接受

    之前A客戶有用過Biztalk 但B客戶因為business process的關係 他們不打算用Biztalk
    所以才要使用這樣的方式 唉~
    不然用biztalk方便很多說 Orz
  • 小毛你好
    那請問一下
    你要呼叫對方的web services,但是input的參數是一段組好的xml字串?是這個意思嗎?
    那你目前是在資料流程中的指令碼元件中組好了這段文字,放在ssis中的一個變數了嗎?
    如果是這樣的話,那倒是還可以用ssis做
    只是不解的是?
    你是每次執行只會呼叫一次web serices嗎?
    還是多次?

    丫德 於 2009/02/19 09:13 回覆

  • 小毛
  • 板大您好~
    是的~是您說的那樣沒錯~
    不過我目前是在思考要用變數字串 還是用Xml來源元件 去傳送我的資料較好

    呼叫時是call by loop
    一次撈出n筆
    一筆資料就call一次並接收一次feedback
  • 小毛你好
    請問一下
    目前你一開始是怎麼組xml,你的資料來源是db嗎?是多筆嗎?
    然後使用指令碼元件,去組xml字串後我建議是放在資料目的地為-"資料錄集目的地"
    這樣就可以在"控制流程中使用loop的方式?
    你覺得如何?

    丫德 於 2009/02/19 10:04 回覆

  • 小毛
  • 板大您好
    是的 資料來源是db 且利用階層觀念
    ex:
    Table A與B為header/line的關係
    xml內容為 1筆A+多筆B = 一個字串

    感謝您的建議
    但如何使用loop的方式我這邊還沒有實際去try
    因為卡在不知如何呼叫WebService
    想要先測一筆能不能work都沒有辦法.Q_Q
  • 小毛你好
    確定是這樣的話,我就可以做一個範例,不過我是假設傳一段文字進去
    等我一下

    丫德 於 2009/02/19 10:20 回覆

  • 小毛
  • 板主大您好
    太感謝了 這幾天想的都快炸了呢..(暈)
  • 小毛
    請問一下
    對方werb servies回覆的結果會是字串
    還是dataset?

    丫德 於 2009/02/19 10:52 回覆

  • 小毛
  • 板主大您好
    對方回應一樣是一串xml格式的string~
    謝謝您
  • 哈囉!可否請你提供一下他回應的xml格式的string?
    你有嗎?

    丫德 於 2009/02/19 11:04 回覆

  • 小毛
  • 嗨板主大
    大致的內容如下:
    <?xml version="1.0" ?>
    - <MessageContainer>
    <message_type>XX</message_type>
    <message_sender>XX</message_sender>
    <message_sender_id>XX</message_sender_id>
    <message_receiver>XX</message_receiver>
    <message_receiver_id>XX</message_receiver_id>
    <message_generation_time>20090217T090400.315Z</message_generation_time>
    - <ContainerItem>
    <RefKey>2009021310240749</RefKey>
    <PIPType>XX</PIPType>
    <PIPVersion>V010101</PIPVersion>
    <KeyFieldName>XX</KeyFieldName>
    <KeyFieldValue>XX</KeyFieldValue>
    <Status>NEW</Status>
    <RevisedTime>20090217T090400.315Z</RevisedTime>
    <CreatedTime>20090217T090400.315Z</CreatedTime>
    - <Property>
    <Name>Transaction_ID</Name>
    <Value>20090217T090400.315Z</Value>

    要接收的重點是RefKey與Status兩個 feedback欄位..
  • 嗯..因為我是自己用.net webservices寫一個範例
    只回傳一個值
    沒有你上面的回傳那麼多
    不過應該是小改一下就可以了
    等一下我把範例寫到blog你再看看吧
    我目前大致上已模擬出你想要的方式了

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

找更多相關文章與討論