Репликация слиянием SQL Server Express 2005 с использованием RMO вызывает исключение нулевой ссылки - PullRequest
1 голос
/ 17 марта 2010

Я пытаюсь использовать RMO для программного выполнения синхронизации слияния. Я скопировал пример кода SQL Server следующим образом:

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

MergePullSubscription subscription;

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

    // Define the pull subscription.
    subscription = new MergePullSubscription(subscriptionDbName, publisherName, publicationDbName,
                                             publicationName, conn, false);

    // If the pull subscription exists, then start the synchronization.
    if (subscription.LoadProperties())
    {
        // Check that we have enough metadata to start the agent.
        if (subscription.PublisherSecurity != null || subscription.DistributorSecurity != null)
        {
            subscription.SynchronizationAgent.Synchronize();
        }
        else
        {
            throw new ApplicationException("There is insufficent metadata to " +
                "synchronize the subscription. Recreate the subscription with " +
                "the agent job or supply the required agent properties at run time.");
        }
    }
    else
    {
        // Do something here if the pull subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be " +
        "synchronized. Verify that the subscription has " +
        "been defined correctly.", ex);
}
finally
{
    conn.Disconnect();
}

У меня правильно определена публикация слияний серверов, но когда я запускаю приведенный выше код, я получаю исключение нулевой ссылки при вызове:

subscription.SynchronizationAgent.Synchronize();

Трассировка стека выглядит следующим образом:

at Microsoft.SqlServer.Replication.MergeSynchronizationAgent.StatusEventSinkMethod(String message, Int32 percent, Int32* returnValue)

at Test.ConsoleTest.Program.SynchronizePullSubscription() in F:\Visual Studio Projects\Test\source\Test.ConsoleTest\Program.cs:line 124

Кажется, из трассировки стека, как что-то связанное с событием Status, но у меня нет определенного обработчика, и определение его не имеет значения.

1 Ответ

0 голосов
/ 18 марта 2010

Я не совсем понял, почему это происходит. Я мог заставить его работать на одной машине, но на другой машине я постоянно получал исключение NullReferenceException.

Оказывается, я ссылался на сборки в папке SQL Server 2005 SDK. Я удалил их и сослался на них из SQL Server 2008, и с тех пор все работает нормально.

Может быть, это поможет кому-то еще.

...