Основные понятия объектов RMO

Объекты RMO представляют собой сборку управляемого кода, которая инкапсулирует функциональные средства репликации для 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.dll, которая также принадлежит пространству имен Microsoft.SqlServer.Replication, реализует интерфейс управляемого кода для программирования различных агентов репликации (агента моментальных снимков, агента распространителя и агента слияния). Доступ к ее классам может быть получен из объектов RMO для синхронизации подписок. Классы в пространстве имен Microsoft.SqlServer.Replication.BusinessLogicSupport, реализованном с помощью сборки Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, используются для создания пользовательской бизнес-логики для репликации слиянием. Эта сборка является независимой от объектов RMO.

Развертывание приложений на основе объектов RMO

Функционирование объектов RMO зависит от компонентов репликации и компонентов обмена данными с клиентом, которые включены во все версии SQL Server, кроме SQL Server Compact. Чтобы иметь возможность развернуть приложение на основе объектов RMO, необходимо установить на компьютере, предназначенном для эксплуатации приложения, версию SQL Server, которая включает компоненты репликации и компоненты обмена данными с клиентом.

Приступая к работе с объектами RMO

В настоящем разделе приведено описание того, как создать простой проект объекта RMO с использованием Microsoft Visual Studio.

Создание нового проекта Microsoft Visual C#

  1. Запустите среду Visual Studio.

  2. В меню Файл выберите пункт Создать проект. Появится диалоговое окно Создать проект.

  3. В диалоговом окне Типы проектов выберите Проекты Visual C#. В области Шаблоны выберите пункт Приложение Windows.

  4. )Необязательно.) В поле Имя введите имя нового приложения.

  5. Нажмите кнопку ОК, чтобы загрузить шаблон Visual C# Windows.

  6. В меню Проект выберите пункт Добавить ссылку. Появляется диалоговое окно Добавление ссылки.

  7. Выберите следующие сборки из списка на вкладке .NET, а затем нажмите кнопку ОК.

    • Microsoft.SqlServer.Replication .NET Programming Interface

    • 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 Programming Interface

    • 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 требуется, чтобы соединение с экземпляром SQL Server было выполнено с использованием экземпляра класса ServerConnection. Это соединение с сервером выполняется независимо от каких-либо программных объектов RMO. После этого соединение передается объекту RMO либо во время создания экземпляра, либо в результате присваивания свойства ConnectionContext объекту. Это позволяет создать экземпляр объекта программирования RMO независимо от объекта соединения и разделить задачи их управления. Один объект соединения можно использовать с несколькими объектами программирования RMO. Для соединений с сервером репликации действуют следующие правила.

  • Все свойства соединения определяются применительно к данному конкретному объекту ServerConnection.

  • Соединение с каждым экземпляром SQL Server должно иметь свой собственный объект ServerConnection.

  • Объект ServerConnection назначается свойству ConnectionContext программного объекта RMO, создаваемого или применяемого для доступа на сервере.

  • Метод Connect открывает соединение с сервером. Этот метод должен быть вызван перед вызовом любых методов любых программных объектов RMO, использующих соединение, которые получают доступ к серверу.

  • В объектах RMO и управляющих объектах SQL Server (объектах SMO) используется класс ServerConnection для создания соединений с SQL Server, поэтому одно и то же соединение может использоваться и объектами RMO, и объектами SMO. Дополнительные сведения см. в разделе Соединение с экземпляром SQL Server.

  • Все данные проверки подлинности, необходимые для установления соединения и входа на сервер, передаются в объекте ServerConnection.

  • По умолчанию используется проверка подлинности Windows. Чтобы можно было использовать проверку подлинности SQL Server, в качестве LoginSecure должно быть задано значение false, а свойствам Login и Password должны быть присвоены допустимое имя входа и пароль SQL Server. Учетные данные безопасности должны всегда храниться и обрабатываться с учетом требований безопасности и при любой возможности предоставляться только во время выполнения.

  • Для многопоточных приложений в каждом потоке должен использоваться отдельный объект ServerConnection.

Вызовите метод Disconnect объекта ServerConnection, чтобы закрыть активные соединения сервера, используемые объектами RMO.

Задание свойств объектов RMO

Свойства программных объектов RMO представляют свойства этих объектов репликации на сервере. При создании новых объектов репликации на сервере для определения этих объектов используются свойства объектов RMO. Для существующих объектов все свойства объектов RMO представляют свойства существующего объекта, подлежащие изменению только в части тех свойств, которым требуется установка или запись значения. Свойства могут быть заданы для новых объектов или существующих объектов.

Задание свойств для новых объектов репликации

При создании новых объектов репликации на сервере необходимо указывать все обязательные свойства перед вызовом метода Create объекта. Дополнительные сведения о задании свойств для нового объекта репликации см. в разделе Как настроить публикацию и распространение (программирование объектов RMO).

Задание свойств для существующих объектов репликации

Применительно к объектам репликации, существующим на сервере (в зависимости от объекта), объекты RMO могут поддерживать возможность изменения некоторых или всех свойств. Могут быть изменены только свойства, предназначенные для записи или доступные для задания. Прежде чем появится возможность изменить свойства, необходимо вызвать метод Load или LoadProperties, чтобы получить текущие значения свойств с сервера. Вызов этих методов становится указанием на то, что существующий объект подлежит изменению.

По умолчанию при изменении свойства объекта в технологии RMO осуществляется фиксация этих изменений на сервере с учетом используемого режима выполнения ServerConnection. Метод IsExistingObject может применяться для проверки того, существует ли объект на сервере, перед осуществлением попытки получения или изменения его свойств. Дополнительные сведения об изменении свойств объекта репликации см. в разделе Как просмотреть и изменить свойства издателя и распространителя (программирование объектов RMO).

ПримечаниеПримечание

Если доступ к одному и тому же объекту репликации на сервере осуществляется несколькими клиентами RMO или несколькими экземплярами одного из программных объектов RMO, то может быть вызван метод Refresh объекта RMO для обновления свойств с учетом текущего состояния объекта на сервере.

Кэширование изменений свойств

Если свойство SqlExecutionModes имеет значение CaptureSql, то происходит перехват всех инструкций Transact-SQL, выработанных объектами RMO, чтобы эти инструкции можно было выполнить вручную в одном пакете с использованием одного из методов выполнения. Технология 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();
            }