複寫管理物件概念。

複寫管理物件 (RMO) 是一種 Managed 程式碼組件,用以封裝 SQL Server 的複寫功能。RMO 是由 Microsoft.SqlServer.Replication 命名空間實作。

下列章節中的主題將說明如何使用 RMO 屬性,以程式設計方式控制複寫工作。

RMO 程式設計簡介

RMO 是針對程式設計 SQL Server 複寫的所有層面所設計。RMO 命名空間是 Microsoft.SqlServer.Replication,而且它是 Microsoft.SqlServer.Rmo.dll 所實作,這個檔案是 Microsoft .NET Framework 組件。同時也屬於 Microsoft.SqlServer.Replication 命名空間的 Microsoft.SqlServer.Replication.dll 組件,會實作 Managed 程式碼介面,以設計各種複寫代理程式的程式 (快照集代理程式、散發代理程式以及合併代理程式)。可從 RMO 存取其類別以同步處理訂閱。在由 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 組件所實作的 Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空間中的類別,是用以為合併式複寫建立自訂商務邏輯。這個組件與 RMO 無關。

根據 RMO 部署應用程式

RMO 相依於隨附在所有版本的 SQL Server (但 SQL Server Compact 除外) 中之複寫元件與用戶端連接元件。若要根據 RMO 部署應用程式,您必須在應用程式將執行的電腦上,安裝含有複寫元件與用戶端連接元件的 SQL Server 版本。

RMO 使用者入門

本章節描述如何使用 Microsoft Visual Studio 啟動簡單的 RMO 專案。

若要建立新的 Microsoft Visual C# 專案

  1. 啟動 Visual Studio。

  2. [檔案] 功能表上按一下 [新增專案][新增專案] 對話方塊隨即出現。

  3. [專案類型] 對話方塊中,選取 [Visual C# 專案]。在 [範本] 窗格中,選取 [Windows 應用程式]

  4. (選擇性) 在 [名稱] 中,輸入新應用程式的名稱。

  5. 按一下 [確定],載入 Visual C# Windows 範本。

  6. [專案] 功能表上選取 [加入參考] 項目。[加入參考] 對話方塊隨即出現。

  7. [.NET] 索引標籤選取下列組件,然後按一下 [確定]

    • Microsoft.SqlServer.Replication .NET 程式設計介面

    • Microsoft.SqlServer.ConnectionInfo

    • 複寫代理程式程式庫

    [!附註]

    使用 CTRL 鍵以選取一個以上的檔案。

  8. (選擇性) 重複步驟 6。按一下 [瀏覽] 索引標籤,導覽至 C:\Program Files\Microsoft SQL Server\100\COM,選取 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll,然後按一下 [確定]

  9. [檢視] 功能表中,按一下 [程式碼]

  10. 在程式碼中的命名空間陳述式前面,輸入下列 using 陳述式來限定 RMO 命名空間中的類型:

    // These namespaces are required.
    using Microsoft.SqlServer.Replication;
    using Microsoft.SqlServer.Management.Common;
    // This namespace is only used when creating custom business
    // logic for merge replication.
    using Microsoft.SqlServer.Replication.BusinessLogicSupport; 
    

建立新的 Microsoft Visual Basic .NET 專案

  1. 啟動 Visual Studio。

  2. [檔案] 功能表上選取 [新增專案][新增專案] 對話方塊隨即出現。

  3. 在 [專案類型] 窗格中,選取 [Visual Basic]。在 [範本] 窗格中,選取 [Windows 應用程式]

  4. (選擇性) 在 [名稱] 方塊中,輸入新應用程式的名稱。

  5. 按一下 [確定],載入 Visual Basic Windows 範本。

  6. [專案] 功能表上,選取 [加入參考][加入參考] 對話方塊隨即出現。

  7. [.NET] 索引標籤選取下列組件,然後按一下 [確定]

    • Microsoft.SqlServer.Replication .NET 程式設計介面

    • Microsoft.SqlServer.ConnectionInfo

    • 複寫代理程式程式庫

    [!附註]

    使用 CTRL 鍵以選取一個以上的檔案。

  8. (選擇性) 重複步驟 6。按一下 [瀏覽] 索引標籤,導覽至 C:\Program Files\Microsoft SQL Server\100\COM,選取 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll,然後按一下 [確定]

  9. [檢視] 功能表中,按一下 [程式碼]

  10. 在程式碼的任何宣告前面,輸入下列 Imports 陳述式,以限定 RMO 命名空間中的類型。

    ' These namespaces are required.
    Imports Microsoft.SqlServer.Replication
    Imports Microsoft.SqlServer.Management.Common
    ' This namespace is only used when creating custom business
    ' logic for merge replication.
    Imports Microsoft.SqlServer.Replication.BusinessLogicSupport 
    

連接至複寫伺服器

RMO 程式設計物件需要使用 ServerConnection 類別的執行個體,來建立 SQL Server 執行個體的連接。這個伺服器連接會獨立於任何 RMO 程式設計物件之外建立。接著會在執行個體建立期間將它傳遞到 RMO 物件,或是將它指派到物件的 ConnectionContext 屬性。以此方式,就可以個別建立和管理 RMO 程式設計物件與連接物件執行個體,而且多個 RMO 程式設計物件可以重複使用單一連接物件。下列規則適用於應用程式伺服器的連接:

  • 連接的所有屬性是針對指定的 ServerConnection 物件所定義。

  • 每個 SQL Server 執行個體的連接都必須有它自己的 ServerConnection 物件。

  • 會將 ServerConnection 物件指派到要在伺服器上建立或存取的 RMO 程式設計物件之 ConnectionContext 屬性。

  • Connect 方法會開啟伺服器的連接。必須先呼叫這個方法,才能呼叫在使用此連接的任何 RMO 程式設計物件上存取伺服器之任何方法。

  • 因為 RMO 與 SQL Server 管理物件 (SMO) 都使用 ServerConnection 類別連接至 SQL Server,所以 RMO 與 SMO 物件都可以使用相同的連接。如需詳細資訊,請參閱<連接到 SQL Server 的執行個體>。

  • ServerConnection 物件中,會提供所有建立連接及成功登入伺服器的驗證資訊。

  • Windows 驗證是預設值。若要使用 SQL Server 驗證,必須將 LoginSecure 設定為 false 與 Login,而且 Password 必須設定為有效的 SQL Server 登入與密碼。安全性認證必須以安全方式儲存和處理,而且每當有需要時必須在執行階段提供。

  • 對於多執行緒應用程式,應該在每個執行緒中使用個別的 ServerConnection 物件。

ServerConnection 物件上呼叫 Disconnect 方法,以關閉 RMO 物件所使用的使用中伺服器連接。

設定 RMO 屬性

RMO 程式設計物件的屬性代表在伺服器這些複寫物件的屬性。在伺服器建立新複寫物件時,會使用 RMO 屬性來定義這些物件。對於現有的物件,RMO 屬性代表現有物件的屬性,只能修改可寫入或是可設定的屬性。屬性可以在新物件或是現有物件上設定。

設定新複寫物件的屬性

在伺服器建立新複寫物件時,您必須先指定所有必要的屬性,才能呼叫物件的 Create 方法。如需有關為新複寫物件設定屬性的詳細資訊,請參閱<如何:設定發行和散發 (RMO 程式設計)>。

設定現有複寫物件的屬性

對於存在於伺服器上的複寫物件,視物件而定,RMO 可能支援變更某些或是所有其屬性的能力。只可以變更可寫入的或可設定的屬性。在變更屬性之前,必須先呼叫 Load 或 LoadProperties 方法,從伺服器取得目前的屬性。呼叫這些方法表示要修改現有的物件。

依預設,當變更物件屬性時,RMO 會根據要使用的 ServerConnection 之執行模式,將這些變更認可到伺服器。IsExistingObject 方法可用以在嘗試擷取或是變更其屬性之前,先驗證存在於伺服器的物件。如需有關變更複寫物件屬性的詳細資訊,請參閱<如何:檢視和修改發行者和散發者屬性 (RMO 程式設計)>。

[!附註]

當有多個 RMO 用戶端或是多個 RMO 程式設計物件的執行個體,在伺服器上存取相同複寫物件時,可以呼叫 RMO 物件的 Refresh 方法,以便根據伺服器上物件目前的狀態來更新屬性。

快取屬性變更

當將 SqlExecutionModes 屬性設定為 CaptureSql 時,會擷取 RMO 產生的所有 Transact-SQL 陳述式,這樣就可以使用其中一個執行方法,以單一批次手動執行它們。RMO 可讓您使用物件的 CommitPropertyChanges 方法,以擷取屬性變更並在單一批次中一起認可它們。若要快取屬性變更,必須將物件的 CachePropertyChanges 屬性設定為 true。在快取 RMO 中的屬性變更時,ServerConnection 物件仍然會控制何時將變更傳送到伺服器。如需有關快取複寫物件之屬性變更的詳細資訊,請參閱<如何:檢視和修改發行者和散發者屬性 (RMO 程式設計)>。

重要事項重要事項

雖然 ServerConnection 類別支援在設定屬性時宣告明確的交易,不過,這樣的交易可能會平擾內部複寫交易、可能會產生非預期的結果,而且不應該與 RMO 搭配使用。

範例

這個範例會示範屬性變更的快取。會快取對於交易式發行集屬性所做的變更,直到將它們明確地傳送到伺服器為止。

          // Define the server, database, and publication names
            string publisherName = publisherInstance;
            string publicationName = "AdvWorksProductTran";
            string publicationDbName = "AdventureWorks2008R2";

            TransPublication publication;

            // Create a connection to the Publisher.
            ServerConnection conn = new ServerConnection(publisherName);

            try
            {
                // Connect to the Publisher.
                conn.Connect();

                // Set the required properties for the publication.
                publication = new TransPublication();
                publication.ConnectionContext = conn;
                publication.Name = publicationName;
                publication.DatabaseName = publicationDbName;

                // Explicitly enable caching of property changes on this object.
                publication.CachePropertyChanges = true;

                // If we can't get the properties for this publication, 
                // throw an application exception.
                if (publication.LoadProperties())
                {
                    // Enable support for push subscriptions and disable support 
                    // for pull subscriptions.
                    if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
                    {
                        publication.Attributes ^= PublicationAttributes.AllowPull;
                    }
                    if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
                    {
                        publication.Attributes |= PublicationAttributes.AllowPush;
                    }

                    // Send changes to the server.
                    publication.CommitPropertyChanges();
                }
                else
                {
                    throw new ApplicationException(String.Format(
                        "Settings could not be retrieved for the publication. " +
                        "Ensure that the publication {0} exists on {1}.",
                        publicationName, publisherName));
                }
            }
            catch (Exception ex)
            {
                // Do error handling here.
                throw new ApplicationException(
                    "The publication property could not be changed.", ex);
            }
            finally
            {
                conn.Disconnect();
            }