共用方式為


使用 BizTalk Server 從 SQL 以累加方式接收查詢通知

重要

為了簡潔起見,本主題只會說明如何以累加方式接收通知。 在商務案例中,協調流程必須包含邏輯,以擷取收到的通知訊息類型,然後執行任何後續作業。 換句話說,本主題所述的協調流程必須建置在處理通知訊息中所述的協調流程之上,才能使用BizTalk Server完成 SQL 中的特定工作

本主題示範如何設定 SQL 配接器,以從SQL Server資料庫接收累加查詢通知訊息。 若要示範累加式通知,請考慮具有 「狀態」資料行的資料表 Employee。 當新記錄插入此資料表時,Status 資料行的值會設定為 0。 您可以執行下列動作,將配接器設定為接收累加通知:

  • 使用 SQL 語句註冊通知,以擷取狀態資料行為 0 的所有記錄。 您可以指定 NotificationStatement 系結屬性的 SQL 語句來執行此動作。

  • 對於已接收通知訊息的資料列,請將 [狀態] 資料行更新為 1。

    本主題示範如何建立 BizTalk 協調流程,並設定 BizTalk 應用程式以達成此目的。

使用 SQL 配接器系結屬性設定通知

下表摘要說明您用來設定從SQL Server接收通知的 SQL 配接器系結屬性。 在 BizTalk Server 管理主控台中設定接收埠時,您必須指定這些系結屬性。

注意

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

Binding 屬性 Description
InboundOperationType 指定您想要執行的輸入作業。 若要接收通知訊息,請將此設定為 [通知]。
NotificationStatement 指定用來註冊查詢通知的 SQL 語句 (SELECT 或 EXEC < 預存程式 >) 。 只有在指定 SQL 語句的結果集變更時,配接器才會從SQL Server收到通知訊息。
NotifyOnListenerStart 指定當接聽程式啟動時,配接器是否會將通知傳送給配接器用戶端。

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

本主題如何示範接收通知訊息

為了示範 SQL 配接器如何支援從SQL Server接收通知訊息,本主題將示範如何設定配接器以接收 Employee 資料表變更的通知。 假設 Employee 資料表有資料行Employee_ID、名稱及狀態。 每當新增員工時,[狀態] 資料行的值就會設定為 0。

若要示範接收通知,請執行下列動作:

  • 產生 通知 (輸入作業) 的架構,然後在 Employee 資料表上 選取 (輸出作業) 。

  • 建立具有下列作業的協調流程:

    • 接收通知訊息的接收位置。 您可以藉由將 SELECT 語句指定為下列專案來設定通知:

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0  
      

      注意

      您必須特別指定 語句中的資料行名稱,如這個 SELECT 語句所示。 此外,您也必須一律指定資料表名稱以及架構名稱。 例如: dbo.Employee

    • 用來更新已傳送通知之資料列的傳送埠。 若要這樣做,請在 [狀態] 資料行中將值設定為 1。 您可以將下列訊息傳送至配接器,作為 Select 作業的一部分來執行此動作。

      <Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
        <Columns>Employee_ID,Name,Status</Columns>  
        <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
      </Select>  
      

      在此訊息中 <Query> ,您會指定 UPDATE 語句來更新 Status 資料行。 請注意,在接收通知訊息之後,必須執行這項作業,以便更新已處理的資料列。 若要避免等候收到通知回應的額外負荷,然後手動卸載要求訊息以更新資料列,您將會產生要求訊息來更新協調流程本身中的資料列。 您可以使用協調流程內的 建構訊息 圖形來執行此動作。

如何從SQL Server資料庫接收通知訊息

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

  1. 建立 BizTalk 專案,然後在 Employee 資料表上產生 通知 (輸入作業的架構) 和 選取 (輸出作業) 。 您可以選擇性地指定 InboundOperationTypeNotificationStatement 系結屬性的值。

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

  3. 在 BizTalk 專案中建立訊息,以在SQL Server資料庫和接收回應訊息上執行 [選取資訊]。

  4. 建立執行下列動作的協調流程:

    • 從SQL Server接收通知訊息。

    • 建立訊息以選取並更新接收通知的資料列。

    • 將此訊息傳送至SQL Server,以更新資料列並接收回應。

  5. 建置和部署 BizTalk 專案。

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

    注意

    對於接收通知訊息等輸入作業,您只能設定單向 WCF-Custom 或 WCF-SQL 接收埠。 輸入作業不支援雙向 WCF-Custom 或 WCF-SQL 接收埠。

  7. 啟動 BizTalk 應用程式。

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

以本主題為基礎的範例

根據本主題提供的範例 IncrementalNotification 隨附 BizTalk 配接器套件。 如需詳細資訊,請參閱 SQL 配接器的範例

產生架構

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

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

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

  3. 產生 通知 作業的架構。

  4. 選取合約類型作為 用戶端 (輸出作業)

  5. Employee資料表上產生Select作業的架構。

定義訊息和訊息類型

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

針對本主題,您必須建立三個訊息:一個接收來自SQL Server資料庫的通知、一個用來執行 Select 作業,另一個用來接收 Select 作業的回應。

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

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

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

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

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

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

    使用 作法
    識別碼 輸入 NotifyReceive
    訊息類型 從下拉式清單中展開 [架構],然後選取[SQLNotify.Notification],其中 SQLNotify是您 BizTalk 專案的名稱。 通知 是針對 通知 作業產生的架構。
  6. 重複步驟 3 以建立兩個新的訊息。 在新訊息的 [ 屬性] 窗格中,執行下列動作:

    將識別碼設定為 將訊息類型設定為
    選取 SQLNotify.TableOperation_dbo_Employee.Select,其中 TableOperation_dbo_Employee 是針對 Select 作業產生的架構
    SelectResponse SQLNotify.TableOperation_dbo_Employee.SelectResponse

設定協調流程

您必須建立 BizTalk 協調流程,以使用BizTalk Server從SQL Server資料庫接收通知訊息,然後更新接收通知的資料列。 在此協調流程中,配接器會根據針對 NotificationStatement 系結屬性指定的 SELECT 語句來接收通知訊息。 通知訊息會在 FILE 位置接收。 收到回應之後,協調流程會建構訊息,用來更新接收通知的資料列。 此訊息的回應也會在相同的 FILE 位置接收。

因此,您的協調流程必須包含下列專案:

  • 接收通知訊息的單向接收埠。

  • 雙向傳送埠,用來傳送訊息以更新資料列,並接收相同訊息的回應。

  • 構訊息 圖形,可在協調流程內建構訊息,以執行更新作業。

  • 用來儲存更新作業回應的 FILE 傳送埠。

  • 接收和傳送圖形。

    範例協調流程如下所示。

    接收 SQL Server通知的協調流程

新增訊息圖形

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

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

- 將 Activate 設定為 True
SaveNotification 傳送 - 將 [名稱 ] 設定為 SaveNotification
SendSelectMessage 傳送 - 將 [名稱 ] 設定為 SendSelectMessage
ReceiveSelectResponse 接收 - 將 名稱 設定為 ReceiveSelectResponse
SaveSelectResponse 傳送 - 將 [名稱 ] 設定為 SaveSelectResponse

新增建構訊息圖形

您可以使用 建構訊息 圖形,在作業內產生要求訊息,以執行 Select 作業。 若要這樣做,您必須將 建構訊息 圖形和該訊息 指派 圖形新增至協調流程。 在此範例中,訊息指派圖形會叫用程式碼,以產生傳送至SQL Server的訊息來執行 Select 作業。 [訊息指派] 圖形也會設定要傳送至SQL Server之訊息的動作。

針對建構訊息圖形,將 Message Constructed 屬性設定為 Select

產生回應的程式碼可能是與 BizTalk 專案相同的 Visual Studio 解決方案的一部分。 產生回應訊息的範例程式碼看起來像這樣。

namespace SampleMessageCreator  
{  
    public class SampleMessageCreator  
    {  
        private static XmlDocument Message;  
        private static string XmlFileLocation;  
        private static string ResponseDoc;  
        public static XmlDocument XMLMessageCreator()  
        {  
            XmlFileLocation = "C:\\TestLocation\\CreateMessage";  
            try  
            {  
                ResponseDoc = (Directory.GetFiles(XmlFileLocation, "*.xml", SearchOption.TopDirectoryOnly))[0];  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Trying to get XML from: " + XmlFileLocation);  
                Console.WriteLine("EXCEPTION: " + ex.ToString());  
                throw ex;  
            }  
            //Create Message From XML  
            Message = new XmlDocument();  
            Message.PreserveWhitespace = true;  
            Message.Load(ResponseDoc);  
            return Message;  
        }   
    }  
}  

若要讓上述程式碼摘錄能夠產生要求訊息,您必須有 XML 要求訊息 ([員工] 資料表上 [選取] 作業的 XML 要求訊息,) 變數 XmlFileLocation 指定的位置。

注意

建置專案之後,將會在專案目錄中建立 SampleMessageCreator.dll。 您必須將此 DLL 新增至全域組件快取 (GAC) 。 此外,您必須在 BizTalk 專案中新增 SampleMessageCreator.dll 作為參考。

新增下列運算式,以從 訊息指派 圖形叫用此程式碼,並設定訊息的動作。 若要新增運算式,請按兩下 [訊息指派 ] 圖形以開啟 [運算式編輯器]。

Select = SampleMessageCreator.SampleMessageCreator.XMLMessageCreator();  
Select(WCF.Action) = "TableOp/Select/dbo/Employee";  

新增埠

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

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

- 將 類型 設定為 SQLNotifyPortType

- 將 通訊模式 設定為 單向

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

- 將 類型 設定為 SaveMessagePortType

- 將 通訊模式 設定為 單向

- 設定要傳送的通訊方向

- 建立作業 通知。 此作業用於通知訊息。

- 建立作業 選取。 此作業用於選取回應訊息。
SQLOutboundPort - 將 識別碼 設定為 SQLOutboundPort

- 將 類型 設定為 SQLOutboundPortType

- 將 通訊模式 設定為 Request-Response

- 將 通訊方向 設定為 Send-Receive

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

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

圖形 屬性
ReceiveNotification - 將 訊息 設定為 NotifyReceive

- 將 作業 設定為 SQLNotifyPort.Notify.Request
SaveNotification - 將 訊息 設定為 NotifyReceive

- 將 作業 設定為 SaveMessagePort.Notify.Request
SendSelectMessage - 將 訊息 設定為 [選取]

- 將作業 設定為 SQLOutboundPort.Select.Request
ReceiveSelectResponse - 將 訊息 設定為 SelectResponse

- 將 作業 設定為 SQLOutboundPort.Select.Response
SaveSelectResponse - 將 訊息 設定為 SelectResponse

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

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

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

設定 BizTalk 應用程式

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

設定應用程式牽涉到:

  • 選取應用程式的主機。

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

    • 定義實體 WCF-Custom 或 WCF-SQL 單向接收埠。 此埠會接聽來自SQL Server資料庫的通知。 如需如何建立埠的詳細資訊,請參閱 手動設定實體埠系結至 SQL 配接器。 請確定您為接收埠指定下列系結屬性。

      重要

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

      Binding 屬性
      InboundOperationType 將此設定為 [通知]。
      NotificationStatement 將此設定為:

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0

      注意: 您必須特別指定 語句中的資料行名稱,如這個 SELECT 語句所示。 此外,您也必須一律指定資料表名稱以及架構名稱。 例如: dbo.Employee
      NotifyOnListenerStart 將此設定為 True

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

      注意

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

    • 定義實體 WCF-Custom 或 WCF-SQL 傳送埠,以將訊息傳送至SQL Server資料庫。 您也必須在傳送埠中指定動作。

    • 定義硬碟上的位置,以及 BizTalk 協調流程將從SQL Server資料庫卸載訊息的對應檔案埠。 這些是透過 WCF-Custom 或 WCF-SQL 傳送埠執行之選取和更新作業所接收SQL Server和訊息的通知訊息。

啟動應用程式

您必須啟動 BizTalk 應用程式,以接收來自SQL Server資料庫的通知訊息,以及執行後續的選取和更新作業。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程

在此階段,請確定:

  • WCF-Custom 或 WCF-SQL 單向接收埠,從SQL Server資料庫接收通知訊息正在執行。

  • WCF-Custom 或 WCF-SQL 傳送埠,以在 Employee 資料表上執行 Select 和 Update 作業。

  • 正在執行從 SQL Server 接收訊息的 FILE 傳送埠。

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

執行作業

若要執行這項作業,您必須將記錄插入 Employee 資料表。 讓我們假設您插入具有下列詳細資料的記錄:

Name = John Smith  
Designation = Manager  
Salary = 100000  

此外,請確定要執行 Select 和 Update 作業的 XML 訊息可在 C:\TestLocation\MessageIn 取得。 XML 檔案應該如下所示:

<Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
  <Columns>Employee_ID,Name,Status</Columns>  
  <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
</Select>  

插入記錄之後,就會以相同的循序執行下列一組動作:

  • 配接器會收到類似下列的通知訊息:

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Insert</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    此訊息會通知已在 Employee 資料表中插入記錄。 請注意,元素的值 <Info> 是 「Insert」。

  • 配接器會執行 Select 作業。 由於 Select 作業 XML 也包含 Update 語句,因此也會執行 Update 語句。 SQL Server的下一個回應是 Select 語句。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult>  
        <Employee xmlns="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">  
          <Employee_ID>10006</Employee_ID>   
          <Name>John</Name>   
          <Status>0</Status>  
        </Employee>  
      </SelectResult>  
    </SelectResponse>  
    

    此回應顯示記錄已插入 Employee 資料表,而該記錄的狀態為 0。

  • 在 Select 語句中,也會執行 Update 語句,並將新記錄的 Status 資料行變更為 1。 這再次觸發來自SQL Server的另一個通知,而配接器會收到對應的通知訊息,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Update</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    此訊息會通知 Employee 資料表中已更新記錄。 請注意,元素的值 <Info> 是 「Update」。

  • 第二個通知之後,配接器會執行 Select 語句。 不過,因為現在沒有狀態為 0 的記錄,所以配接器會取得空的回應,如下所示。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult />   
    </SelectResponse>  
    

最佳做法

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

另請參閱

使用 BizTalk Server 接收 SQL 查詢通知