共用方式為


使用 BizTalk Server 從SQL Server接收輪詢型資料變更的訊息

您可以設定 SQL 配接器來接收SQL Server資料表或檢視表的定期資料變更訊息。 您可以指定配接器執行以輪詢資料庫的輪詢語句。 輪詢語句可以是 SELECT 語句或傳回結果集的預存程式。

如需配接器如何支援輪詢的詳細資訊,請參閱 輪詢支援。 如需輪詢作業之 SOAP 訊息結構的相關資訊,請參閱 輪詢和 TypedPolling 作業的訊息架構

注意

本主題示範如何使用 輪詢 輸入作業來使用輪詢訊息。 輪詢作業的訊息不是強型別,而且正在輪詢的物件架構會在執行時間連同訊息一起擷取。 如果您想要取得強型別輪詢訊息,您必須使用 TypedPolling 作業。 您也必須使用 TypedPolling 作業,在單一 BizTalk 應用程式中有多個輪詢作業。 如需如何執行TypedPolling作業的指示,請參閱使用 BizTalk Server 從 SQL Server 接收強型別輪詢型資料變更訊息

重要

如果您想要在單一 BizTalk 應用程式中有多個輪詢作業,您必須將 InboundID 連線屬性指定為連線 URI 的一部分,使其是唯一的。 透過唯一的連線 URI,您可以建立多個接收埠來輪詢相同的資料庫,甚至是資料庫中的相同資料表。 如需詳細資訊,請參閱使用 BizTalk Server 從 SQL 接收跨多個接收埠接收輪詢訊息

本主題示範輪詢的方式

在本主題中,若要示範 SQL 配接器如何支援接收資料變更訊息、建立 BizTalk 專案,以及產生 輪詢 作業的架構。 如果您想要在設計階段指定輪詢相關的系結屬性,請將 PolledDataAvailableStatement 指定為:

SELECT COUNT(*) FROM Employee  

PolledDataAvailableStatement必須傳回包含正值的第一個儲存格的結果集。 如果第一個儲存格不包含正值,配接器就不會執行輪詢語句。

在輪詢語句中,執行下列作業:

  • 從 Employee 資料表選取所有資料列。

  • 執行預存程式 (MOVE_EMP_DATA) 將所有記錄從 Employee 資料表移至 EmployeeHistory 資料表。

  • 執行預存程式 (ADD_EMP_DETAILS) 將新記錄新增至 Employee 資料表。 此程式會採用員工名稱、指定和薪資作為參數。

    若要執行這些作業,您必須為 PollingStatement 系結屬性指定下列專案:

SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000   

執行輪詢語句之後,會選取 Employee 資料表中的所有記錄,並將來自SQL Server的訊息捨棄到接收位置。 一旦配接器執行MOVE_EMP_DATA預存程式,所有記錄都會移至 EmployeeHistory 資料表。 然後,會執行ADD_EMP_DETAILS預存程式,將新記錄新增至 Employee 資料表。 下一個輪詢執行只會傳回單一記錄。 此週期會繼續執行,直到您停用輪詢SQL Server的接收埠為止。

使用 SQL 配接器系結屬性設定輪詢查詢

下表摘要說明您用來設定配接器以接收資料變更訊息的 SQL 配接器系結屬性。 在 BizTalk Server 管理主控台中設定接收埠時,您必須指定這些系結屬性。

注意

在產生 輪詢 作業的架構時,您可以選擇指定這些系結屬性,即使它並非必要也一樣。 如果您這麼做,取用配接器服務增益集產生的埠系結檔案也會包含您為系結屬性指定的值。 您稍後可以在 BizTalk Server 管理主控台中匯入此系結檔案,以建立已設定系結屬性的 WCF 自訂或 WCF-SQL 接收埠。 如需使用系結檔案建立埠的詳細資訊,請參閱 使用埠系結檔案設定實體埠系結以使用 SQL 配接器

Binding 屬性 Description
InboundOperationType 指定您是否要執行 PollingTypedPolling通知 輸入作業。 預設值為 輪詢
PolledDataAvailableStatement 指定配接器執行的 SQL 語句,以判斷是否有任何資料可供輪詢。 SQL 語句必須傳回包含資料列和資料行的結果集。 只有當資料列可用時,才會執行 針對 PollingStatement 系結屬性指定的 SQL 語句。
PollingIntervalInSeconds 指定 SQL 配接器執行 PolledDataAvailableStatement 系結屬性所指定的語句的間隔,以秒為單位。 預設值為 30 秒。 輪詢間隔會決定連續輪詢之間的時間間隔。 如果語句是在指定的間隔內執行,配接器會等候間隔中的剩餘時間。
PollingStatement 指定要輪詢SQL Server資料庫資料表的 SQL 語句。 您可以為輪詢語句指定簡單的 SELECT 語句或預存程式。 預設值是 null。 您必須指定 PollingStatement 的值,才能啟用輪詢。 只有在有資料可供輪詢時,才會執行輪詢語句,這是 由 PolledDataAvailableStatement 系結屬性所決定。 您可以指定以分號分隔的任意數目 SQL 語句。
PollWhileDataFound 指定 SQL 配接器是否忽略輪詢間隔,並持續執行 針對 PolledDataAvailableStatement 系結屬性指定的 SQL 語句,如果資料表中有要輪詢的資料。 如果資料表中沒有可用的資料,配接器會還原為在指定的輪詢間隔執行 SQL 語句。 預設值為 false

如需這些屬性的更完整描述,請參閱閱讀 BizTalk Adapter for SQL Server 配接器系結屬性。 如需如何使用 SQL 配接器輪詢SQL Server的完整描述,請參閱進一步。

如何從SQL Server資料庫接收資料變更訊息

使用具有BizTalk Server的 SQL 配接器在SQL Server資料庫上執行作業,牽涉到使用 SQL 配接器開發 BizTalk 應用程式的建置組塊中所述的程式工作。 若要設定配接器以接收資料變更訊息,這些工作如下:

  1. 建立 BizTalk 專案,然後產生 輪詢 作業的架構。 您可以選擇性地指定 PolledDataAvailableStatementPollingStatement 系結屬性的值。

  2. 在 BizTalk 專案中建立訊息,以接收來自SQL Server資料庫的訊息。

  3. 建立協調流程以接收來自SQL Server資料庫的訊息,並將其儲存至資料夾。

  4. 建置和部署 BizTalk 專案。

  5. 藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。

    重要

    針對輸入輪詢案例,您必須一律設定單向 WCF-Custom 或 WCF-SQL 接收埠。 輸入作業不支援雙向 WCF-Custom 或 WCF-SQL 接收埠。

  6. 啟動 BizTalk 應用程式。

    本主題提供執行這些工作的指示。

產生架構

您必須產生 輪詢 作業的架構。 如需如何產生架構的詳細資訊,請參閱使用 SQL 配接器擷取 Visual Studio 中SQL Server作業的中繼資料。 產生架構時,請執行下列工作。 如果您不想在設計階段指定系結屬性,請略過第一個步驟。

  1. 在產生架構時,指定 PolledDataAvailableStatementPollingStatement 系結屬性的值。 如需此系結屬性的詳細資訊,請參閱閱讀 BizTalk Adapter for SQL Server配接器系結屬性

    如需如何指定系結屬性的指示,請參閱 設定 SQL 配接器的系結屬性

  2. 選取合約類型作為 服務 (輸入作業)

  3. 產生 輪詢 作業的架構。

定義訊息和訊息類型

您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 產生架構之後,您必須從 BizTalk 專案的協調流程檢視將它連結到訊息。

針對本主題,您必須建立一則訊息,以接收來自SQL Server資料庫的訊息。

執行下列步驟來建立訊息,並將其連結至架構。

  1. 將協調流程新增至 BizTalk 專案。 從方案總管,以滑鼠右鍵按一下 BizTalk 專案名稱,指向 [新增],然後按一下 [新增專案]。 輸入 BizTalk 協調流程的名稱,然後按一下 [ 新增]。

  2. 如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 [檢視],指向 [其他視窗],然後按一下 [ 協調流程檢視]。

  3. 在協調 流程檢視中,以滑鼠右鍵按一下 [ 訊息],然後按一下 [ 新增訊息]。

  4. 以滑鼠右鍵按一下新建立的訊息,然後選取 [ 屬性視窗]。

  5. Message_1的 [屬性]窗格中,執行下列動作:

    使用 作法
    識別碼 輸入 Receive
    訊息類型 從下拉式清單中,展開 [ 架構],然後選取 [PollingQuery.Polling],其中 PollingQuery 是您 BizTalk 專案的名稱。 輪詢 是針對 輪詢 作業產生的架構。

設定協調流程

您必須建立 BizTalk 協調流程,以使用BizTalk Server從SQL Server資料庫接收輪詢型資料變更訊息。 在此協調流程中,配接器會收到 針對 PollingStatement 系結屬性指定的 select 語句回應。 SELECT 語句的回應會儲存至 FILE 位置。 輪詢SQL Server資料庫的一般協調流程會包含:

  • 接收和傳送圖形,以分別接收來自SQL Server和傳送至 FILE 埠的訊息。

  • 從SQL Server接收訊息的單向接收埠。

    重要

    針對輸入輪詢案例,您必須一律設定單向接收埠。 輸入作業不支援雙向接收埠。

  • 單向傳送埠,將輪詢回應從SQL Server資料庫傳送至資料夾。

    範例協調流程如下所示。

    輪詢SQL Server資料庫的協調流程

新增訊息圖形

請確定您為每個訊息圖形指定下列屬性。 Shape 資料行中列出的名稱是訊息圖形的名稱,如剛才提到的協調流程所示。

圖形 圖形類型 屬性
ReceiveMessage 接收 - 將 名稱 設定為 ReceiveMessage

- 將 Activate 設定為 True
SaveMessage 傳送 - 將 [名稱] 設定為 SaveMessage

新增埠

請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中所列的名稱是協調流程中顯示的埠名稱。

連接埠 屬性
SQLReceivePort - 將 識別碼 設定為 SQLReceivePort

- 將 Type 設定為 SQLReceivePortType

- 將 通訊模式 設定為 單向

- 將 通訊方向 設定為 接收
SaveMessagePort - 將 識別碼 設定為 SaveMessagePort

- 將 類型 設定為 SaveMessagePortType

- 將 通訊模式 設定為 單向

- 設定要傳送的通訊方向

指定動作圖形的訊息並連接到埠

下表指定屬性及其值,您應該設定為指定動作圖形的訊息,以及將訊息連結至埠。 Shape 資料行中所列的名稱是如先前所述協調流程中顯示的訊息圖形名稱。

圖形 屬性
ReceiveMessage - 將 訊息 設定為 接收

- 將 作業 設定為 SQLReceivePort.Polling.Request
SaveMessage - 將 訊息 設定為 接收

- 將 作業 設定為 SaveMessagePort.Polling.Request

指定這些屬性之後,訊息圖形和埠會連線,而且您的協調流程已完成。

您現在必須建置 BizTalk 解決方案,並將其部署至BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程

設定 BizTalk 應用程式

部署 BizTalk 專案之後,您稍早建立的協調流程會列在 BizTalk Server 管理主控台的 [協調流程] 窗格底下。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步解說,請參閱 逐步解說:部署基本 BizTalk 應用程式

設定應用程式牽涉到:

  • 選取應用程式的主機。

  • 將您在協調流程中建立的埠對應至 BizTalk Server 管理主控台中的實體埠。 針對此協調流程,您必須:

    • 定義硬碟上的位置和對應的檔案埠,BizTalk 協調流程會從SQL Server資料庫卸載訊息。 這些訊息將會回應您為接收埠指定的輪詢語句。

    • 定義實體 WCF-Custom 或 WCF-SQL 單向接收埠。 此埠會使用您為埠指定的輪詢語句來輪詢SQL Server資料庫。 如需如何建立埠的資訊,請參閱 手動設定 SQL 配接器的實體埠系結。 請確定您為接收埠指定下列系結屬性。

      重要

      如果您在設計階段指定系結屬性,就不需要執行此步驟。 在這種情況下,您可以匯入取用配接器服務增益集所建立的系結檔案,以建立 WCF-custom 或 WCF-SQL 接收埠,並設定必要的系結屬性。 如需詳細資訊,請參閱 使用埠系結檔案設定實體埠系結以使用 SQL 配接器

      Binding 屬性
      InboundOperationType 請確定您已將此設定為 [輪詢]。
      PolledDataAvailableStatement 請確定您指定 SQL 語句。 針對本主題,指定:

      SELECT COUNT(*) FROM Employee
      PollingStatement 請確定您指定輪詢語句。 針對本主題,指定:

      SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000

      如需不同系結屬性的詳細資訊,請參閱閱讀 BizTalk Adapter for SQL Server配接器系結屬性

      注意

      建議您在使用 SQL 配接器執行輸入作業時,設定交易隔離等級和交易逾時。 您可以藉由在設定 WCF-Custom 或 WCF-SQL 接收埠時新增服務行為來執行此動作。 如需如何新增服務行為的指示,請參閱 使用 SQL 設定交易隔離等級和交易逾時

啟動應用程式

您必須啟動 BizTalk 應用程式,才能從SQL Server資料庫接收訊息。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程

在這個階段,請確定:

  • WCF-Custom 或 WCF-SQL 單向接收埠,它會使用針對 PollingStatement系結屬性指定的語句輪詢SQL Server資料庫。

  • FILE 傳送埠正在執行,該埠會接收來自SQL Server的訊息。

  • 作業的 BizTalk 協調流程正在執行。

執行作業

執行應用程式之後,會以相同循序執行下列一組動作:

  • 配接器會在 Employee 資料表上執行 PolledDataAvailableStatement ,並判斷資料表有輪詢的記錄。

  • 配接器會執行輪詢語句。 因為輪詢語句是由 SELECT 語句和預存程式所組成,所以配接器會逐一執行所有語句。

    • 配接器會先執行 SELECT 語句,以傳回 Employee 資料表中的所有記錄。

    • 配接器接著會執行MOVE_EMP_DATA預存程式,將所有資料從 Employee 資料表移至 EmployeeHistory 資料表。 這個預存程式不會傳回任何值。

    • 配接器接著會執行將一筆記錄新增至 Employee 資料表的ADD_EMP_DETAILS預存程式。 此預存程式會傳回所插入記錄的員工識別碼。

      因此,從 SQL Server 收到的訊息會包含 SELECT 語句和ADD_EMP_DETAILS預存程式 () 的多個結果集,且如下所示:

    <?xml version="1.0" encoding="utf-8" ?>   
    <Polling xmlns="http://schemas.microsoft.com/Sql/2008/05/Polling/">  
      <PolledData>  
        <DataSet xmlns="http://schemas.datacontract.org/2004/07/System.Data">  
          <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
            <xs:element msdata:IsDataSet="true" name="NewDataSet">  
              <xs:complexType>  
                <xs:sequence>  
                  <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">  
                    <xs:complexType>  
                      <xs:sequence>  
                        <xs:element minOccurs="0" name="Employee_ID" type="xs:int" />   
                        <xs:element minOccurs="0" name="Name" type="xs:string" />   
                        <xs:element minOccurs="0" name="DOJ" type="xs:dateTime" />   
                        <xs:element minOccurs="0" name="Designation" type="xs:string" />   
                        <xs:element minOccurs="0" name="Job_Description" type="xs:string" />   
                        <xs:element minOccurs="0" name="Photo" type="xs:base64Binary" />   
                        <xs:element minOccurs="0" name="Rating" type="xs:string" />   
                        <xs:element minOccurs="0" name="Salary" type="xs:decimal" />   
                        <xs:element minOccurs="0" name="Last_Modified" type="xs:base64Binary" />   
                      </xs:sequence>  
                    </xs:complexType>  
                  </xs:element>  
                </xs:sequence>  
              </xs:complexType>  
            </xs:element>  
          </xs:schema>  
          <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">  
            <NewDataSet xmlns="">  
              <NewTable>  
                <Employee_ID>10001</Employee_ID>   
                <Name>John</Name>   
                <Designation>Tester</Designation>   
                <Salary>100000.00</Salary>   
                <Last_Modified>AAAAAAAAF34=</Last_Modified>   
              </NewTable>  
              ........  
              ........  
              <NewTable>  
                <Employee_ID>10005</Employee_ID>   
                <Name>Wilson</Name>   
                <Designation>Tester3</Designation>   
                <Salary>100000.00</Salary>   
                <Last_Modified>AAAAAAAAF4E=</Last_Modified>   
              </NewTable>  
            </NewDataSet>  
          </diffgr:diffgram>  
        </DataSet>  
        <DataSet xmlns="http://schemas.datacontract.org/2004/07/System.Data">  
          <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
            <xs:element msdata:IsDataSet="true" name="NewDataSet">  
              <xs:complexType>  
                <xs:sequence>  
                  <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">  
                    <xs:complexType>  
                      <xs:sequence>  
                        <xs:element minOccurs="0" name="Employee_ID" type="xs:int" />   
                      </xs:sequence>  
                    </xs:complexType>  
                  </xs:element>  
                </xs:sequence>  
              </xs:complexType>  
            </xs:element>  
          </xs:schema>  
          <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">  
            <NewDataSet xmlns="">  
              <NewTable>  
                <Employee_ID>10006</Employee_ID>  
              </NewTable>  
            </NewDataSet>  
          </diffgr:diffgram>  
        </DataSet>  
      </PolledData>  
    </Polling>  
    

    上述回應包含兩個資料集。 第一個資料集包含 SELECT 語句的回應。 SELECT 語句會選取 Employee 資料表中的所有記錄。 第二個資料集適用于ADD_EMP_DETAILS預存程式。 此預存程式會將記錄新增至 Employee 資料表,並傳回新記錄的員工識別碼。

    注意

    MOVE_EMP_DATA預存程式不會傳回結果集。 因此,回應訊息中沒有對應的資料集。

  • 當配接器再次執行 PollDataAvailableStatement 時,它會找到ADD_EMP_DETAILS預存程式所插入的一筆記錄。 配接器接著會執行 針對 PollingStatement 系結屬性指定的三個語句。 這次,來自SQL Server的回應只會包含 SELECT 語句的一筆記錄,以及ADD_EMP_DETAILS預存程式的一筆記錄。 所有後續輪詢都會傳回類似的回應。

注意

SQL 配接器會繼續輪詢,直到您從 BizTalk Server 管理主控台明確停用接收埠為止。

最佳做法

部署並設定 BizTalk 專案之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,因此您不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用配接器系結

另請參閱

使用 SQL 配接器搭配BizTalk Server輪詢SQL Server