0

一般的な機能を提供するために、Sync フレームワークを使用してラッパーを作成しました。

これは私のコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using System.Data.SqlClient;
using Microsoft.Synchronization;


namespace PluginTest.Components
{
    public class P2PProvsionProvider
    {
        public SqlConnection RemoteConnection { get; set; }
        public SqlConnection LocalConnection { get; set; }
        private static Dictionary<string,DbSyncScopeDescription> scopes { get; set; }
        private static SqlSyncScopeProvisioning remoteProvision { get; set; }
        private static SqlSyncScopeProvisioning localProvision { get; set; }

        private static P2PProvsionProvider provider;

        //private P2PProvsionProvider() { 
        //}

        public P2PProvsionProvider() {
            scopes = new Dictionary<string, DbSyncScopeDescription>();
        }

        public static P2PProvsionProvider getInstance(string name) {
            if (name.Equals("default"))
                if (provider == null)
                    provider = new P2PProvsionProvider();
            return provider;
        }
        //1
        public void CreateProvisionScope(string name) {
            if (!scopes.ContainsKey(name))
            {
                scopes.Add(name, new DbSyncScopeDescription(name));
            }
        }

        //2
        public void AddProvisionTable(string scopeName, string tableName) {

            if (scopes[scopeName] != null)
            {
                DbSyncScopeDescription remoteScopeDesc = scopes[scopeName];
                //DbSyncScopeDescription localScopeDesc = scopes[scopeName];
                DbSyncTableDescription remoteTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, RemoteConnection);
                //DbSyncTableDescription localTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, LocalConnection);

                remoteScopeDesc.Tables.Add(remoteTableDesc);
                //localScopeDesc.Tables.Add(localTableDesc);

            }
        }

        //3
        public void ApplyScopeProvisioning (string scopeName){

            remoteProvision = new SqlSyncScopeProvisioning(RemoteConnection, scopes[scopeName]);
            remoteProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);
            remoteProvision.Apply();

            localProvision = new SqlSyncScopeProvisioning(LocalConnection, scopes[scopeName]);
            localProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);
            localProvision.Apply(); 

        }

        #region Scope Provisioning Builder methods
        public SqlSyncScopeProvisioning BuilderCreateProcedures(DbSyncCreationOption option)
        {
            remoteProvision.SetCreateProceduresDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderCreateProceduresForAdditionalScope(DbSyncCreationOption option)
        {
            remoteProvision.SetCreateProceduresForAdditionalScopeDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderCreateTable(DbSyncCreationOption option)
        {
            remoteProvision.SetCreateTableDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderCreateTrackingTable(DbSyncCreationOption option)
        {
            remoteProvision.SetCreateTrackingTableDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderCreateTriggers(DbSyncCreationOption option)
        {
            remoteProvision.SetCreateTriggersDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderPopulateTrackingTable(DbSyncCreationOption option)
        {
            remoteProvision.SetPopulateTrackingTableDefault(option);
            return remoteProvision;
        }

        public SqlSyncScopeProvisioning BuilderUseBulkProcedures(bool useBulk)
        {
            remoteProvision.SetUseBulkProceduresDefault(useBulk);
            return remoteProvision;
        }
        #endregion
        //4


        public SyncOperationStatistics ExecuteSync(string scopeName , SyncDirectionOrder direction = SyncDirectionOrder.UploadAndDownload) {

            SyncOrchestrator syncOrachestrator = new SyncOrchestrator() {
                LocalProvider = new SqlSyncProvider(scopeName, LocalConnection),
                RemoteProvider = new SqlSyncProvider(scopeName, RemoteConnection), 
                Direction = direction 
            };

            ((SqlSyncProvider)syncOrachestrator.LocalProvider).ApplyChangeFailed += (s,e) =>
            {

            };

            return syncOrachestrator.Synchronize();
        }

        //5 Deprovision certain scope
        public void DeprovisionScope(SqlConnection conn, string scopeName) {
            SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn);
            deprovisionScope.DeprovisionScope(scopeName);
        }

        //6 Deprovision All
        public void DeprovisionStore(SqlConnection conn)
        {
            SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn);
            deprovisionScope.DeprovisionStore();
        }
    }
}

質問が示唆するように、ストアドプロシージャが存在しないと言って InvalidOperationException を取得しています。アプリは次のように機能します。フォームで次の定義を提供します。

    public GlobalFramework.Core core { get; set; }
    public BindingList<string> addedTables { get; set; }
    public BindingList<string> provisionedTables { get; set; }
    public P2PProvsionProvider provider { get; set; }
    public SyncOperationStatistics stats { get; set; }

1- ユーザーが「Add Provision Scope」テキストのボタンをクリックすると、次の処理が行われます。

private void provisionButton_Click(object sender, EventArgs e)
    {
        provider.CreateProvisionScope(provisionScopeTextBox.Text);
        foreach (var item in provisionedTables)
        {
            provider.AddProvisionTable(provisionScopeTextBox.Text, item);
        }

    }

2- ユーザーが [Apply Provision] ボタンをクリックすると、次の処理が行われます。

private void applyProvisionButton_Click(object sender, EventArgs e)
    {
        provider.ApplyScopeProvisioning(provisionScopeTextBox.Text);
    }

3- ユーザーが「同期」ボタンをクリックすると、次の処理が行われます。

private void syncButton_Click(object sender, EventArgs e)
    {
        stats = provider.ExecuteSync(provisionScopeTextBox.Text);
        statsLabel.Text = "Start time: " + stats.SyncStartTime + "End Time: " +stats.SyncEndTime+ "Change Total: "+stats.DownloadChangesTotal; 
    }

なぜこの例外が発生し続けるのか疑問に思っています。私のローカル データベース接続は SQL Server 2008 R2 です。私のリモート データベースも SQL Server 2008 R2 です。

PS: スコープを 1 回だけプロビジョニングする必要があることはわかっています。

4

1 に答える 1

1

ストアド プロシージャの作成をスキップするのはなぜですか?

remoteProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip); localProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);

テーブルが以前にプロビジョニングされており、ストアド プロシージャが既に作成されていることがわかっている場合にのみ、作成をスキップする必要があります。

于 2012-12-17T03:13:58.133 に答える