AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6711
Accepted
Stuart
Stuart
Asked: 2011-10-12 08:30:53 +0800 CST2011-10-12 08:30:53 +0800 CST 2011-10-12 08:30:53 +0800 CST

使用 Sync Orchestrator 同步两个 SQL CE 3.5 数据库

  • 772

我正在尝试使用 SqlCeSyncProvider 在两个 SQL Compact 3.5 数据库之间设置同步。我能够为这两个数据库创建一个范围,从而创建一个元表。但是,当我尝试运行 SyncOrchestrator.Synchronize() 时,出现以下错误,并且在插入数据时无法使两个数据库同步:

"An error occurred when initializing adapters for scope 'Person'. Ensure that the scope name specified on the provider exists in the scope metadata table, and that the correct base tables are specified for that scope."

当我运行以下代码时,会为每个数据库创建三个表:Sync_Person_tracking、Sync_scope_config 和 Sync_scope_info。两个数据库在 Sync_scope_info 表中都包含相同的作用域名称 Person。

    SqlCeSyncScopeProvisioning ceConfig = new SqlCeSyncScopeProvisioning();
    SqlCeConnection ceConn = (SqlCeConnection)syncProvider.Connection;
    string scopeName = syncProvider.ScopeName;
    if (!ceConfig.ScopeExists(scopeName, ceConn)) {
        var description = new DbSyncScopeDescription();
        description.ScopeName = scopeName;
        var table = new DbSyncTableDescription("Person");
        var pkCol = new DbSyncColumnDescription("ID", "int");
        pkCol.IsPrimaryKey = true;
        table.Columns.Add(pkCol);
        table.Columns.Add(new DbSyncColumnDescription("Name", "nvarchar 50"));
        table.Columns.Add(new DbSyncColumnDescription("Height", "int"));
        table.Columns.Add(new DbSyncColumnDescription("Weight", "int"));
        description.Tables.Add(table);
        ceConfig.PopulateFromScopeDescription(description);
        ceConfig.SetCreateTableDefault(DbSyncCreationOption.Skip);
        ceConfig.ObjectPrefix = "Sync";
        ceConfig.Apply(ceConn);
    }

在上面的代码中,syncProvider 是一个SqlCESyncProvider 对象,它附加了一个连接字符串到指定的数据库。

下面是我使用 SyncOrchestrator 在数据库之间设置同步的代码:

    _syncOrchestrator.LocalProvider = localSyncProvider;
    _syncOrchestrator.RemoteProvider = remoteSyncProvider;
    _syncOrchestrator.Direction = SyncDirectionOrder.DownloadAndUpload;

    try {
        var sync = _syncOrchestrator.Synchronize();
        Console.WriteLine(string.Format("Sync Downloads: {0}\nSync Uploads: {1}\nSync Start Time: {2}\nSync End Time: {3}",
            sync.DownloadChangesTotal.ToString(), sync.UploadChangesTotal.ToString(),
            sync.SyncStartTime, sync.SyncEndTime));
    } catch (Exception ex) {
        Console.WriteLine(string.Format("Sync Orchestrator threw exception: {0}", ex.Message));
    }

在此先感谢您的帮助!

sql-server embedded
  • 1 1 个回答
  • 1280 Views

1 个回答

  • Voted
  1. Best Answer
    Stuart
    2011-10-14T14:41:20+08:002011-10-14T14:41:20+08:00

    我能够通过更改配置来解决错误。我没有为两个数据库中的每一个调用上面的代码,而是创建了一个函数,如下所示:

        public void SetupScope() {
            if (ProvidersCollection["Local"] != null && ProvidersCollection["Remote"] != null) {
                var localConnection = (SqlCeConnection)((SqlCeSyncProvider)ProvidersCollection["Local"]).Connection;
                var remoteConnection = (SqlCeConnection)((SqlCeSyncProvider)ProvidersCollection["Remote"]).Connection;
    
                var localScopeDescription = new DbSyncScopeDescription("LocalPerson");
                var localPersonTableDescription = SqlCeSyncDescriptionBuilder.GetDescriptionForTable("Person", remoteConnection);
                localScopeDescription.Tables.Add(localPersonTableDescription);
    
                var localDatabaseConfiguration = new SqlCeSyncScopeProvisioning(localConnection);
                try {
                    localDatabaseConfiguration.PopulateFromScopeDescription(localScopeDescription);
                    localDatabaseConfiguration.ObjectPrefix = "Sync";
                    localDatabaseConfiguration.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
                    localDatabaseConfiguration.Apply();
                } catch (Exception ex) {
                    Console.WriteLine(string.Format("{0}", ex.Message));
                }
    
                var remoteScopeDescription = new DbSyncScopeDescription("RemotePerson");
                var remotePersonTableDescription = SqlCeSyncDescriptionBuilder.GetDescriptionForTable("Person", localConnection);
                remoteScopeDescription.Tables.Add(remotePersonTableDescription);
    
                var remoteDatabaseConfiguration = new SqlCeSyncScopeProvisioning(remoteConnection);
                try {
                    remoteDatabaseConfiguration.PopulateFromScopeDescription(remoteScopeDescription);
                    remoteDatabaseConfiguration.ObjectPrefix = "Sync";
                    remoteDatabaseConfiguration.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
                    remoteDatabaseConfiguration.Apply();
                } catch (Exception ex) {
                    Console.WriteLine(string.Format("{0}", ex.Message));
                }
            }
        }
    

    这里的区别在于,对于两个数据库中的每一个,我现在在设置表描述时都引用另一个数据库的连接。

    • 0

相关问题

  • 推荐使用哪些数据库作为嵌入式数据库?

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve