【问题标题】:MS Sync Framework and SQL Server CompactMS 同步框架和 SQL Server Compact
【发布时间】:2017-01-26 11:48:57
【问题描述】:

我开发了一个可以在联机和脱机模式下工作的 Windows C# 应用程序。
在联机模式下,它连接到 SQL Server。在离线模式下,它连接到本地数据库。

我使用 Microsoft Sync Framework 2.1 按需同步 2 个数据库。

到目前为止,我使用 SQL Server 的 LocalDB 实例作为本地数据库。但是在我的应用程序安装过程中自动设置系统很痛苦。所以我坚持使用 SQL Server Compact 3.5 或 4.0,它们非常易于分发(包含在单个文件中)。

但我什至无法编译 Compact DB 的配置代码:

DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("MyScope");
SqlCeConnection clientConn = new SqlCeConnection(OfflineConnectionString);
var clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
clientProvision.Apply();

我以前使用过(没有Ce 类)但SqlCeSyncScopeProvisioning 无法解决。

这里出了点大问题。
如何同步我的 CompactDB 以将其作为本地数据库分发?

【问题讨论】:

  • 您是否尝试过分发 LocalDB 数据库文件?您可以连接到特定的 LocalDB 文件。例如。 connectionString="Data Source=(LocalDb)\v12.0;AttachDbFilename=C:\MyDatabase.mdf;Initial Catalog=MyDatabase;Integrated Security=True"。我没有在客户端 PC 上分发我的应用程序,所以我不知道安装 SqlLocalDB 是否麻烦,但你可以试一试。
  • 安装 SqlLocalDB 并不是那么容易。特别是当我必须删除旧的现有实例并安装新实例时让它工作。但如果紧凑方法失败,我必须继续努力。谢谢。
  • 为什么要删除旧的?它是你的吗?您可以添加任何名称的新实例。我想,我是在提倡 LocalDB,因为 CE 有点老了,最终会死。
  • 是的,我必须替换我的应用程序的旧实例。所以我必须替换本地实例并使用最新的数据库模式安装新实例。但我希望它具有相同的实例名称。
  • 你使用某种 ORM 吗?喜欢 EF 还是 NHibernate?如果是,也许数据库迁移是一个解决方案?

标签: c# sql-server synchronization sql-server-ce microsoft-sync-framework


【解决方案1】:

首先确保,你已经成功安装了sdk?

在此之后,请确保您已添加以下引用:

  • Microsoft.Synchronization.Data.dll,

  • Microsoft.Synchronization.Data.Server.dll

  • Microsoft.Synchronization.Data.SqlServer.dll
  • Microsoft.Synchronization.Data.SqlServerCe.dll

在我的情况下,它也适用于添加

  • System.Data.SqlServerCe - 4.0

编辑

与您的评论相反,这在您使用 SQL Server CE 4 时有效。

我现在已经使用 SQL Server CE 3.5 进行了尝试,确实可以重现您的问题。

切换到 SQL Server CE 4.0 修复了它。

ExampleTable 4.0

测试代码

 var scopeDesc = new DbSyncScopeDescription("MyScope");
 var tbl = new DbSyncTableDescription("TestTable");
 var pkColumn = new DbSyncColumnDescription("Id", "int");
 pkColumn.IsPrimaryKey = true;
 tbl.Columns.Add(pkColumn);
 tbl.Columns.Add(new DbSyncColumnDescription("Name", "nvarchar(254)"));
 scopeDesc.Tables.Add(tbl);
 var clientConn = new SqlCeConnection(@"Data Source=test.sdf;Persist Security Info=False;");
 var clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
 clientProvision.Apply();

结果

一切都编译得很好。完成上述步骤后,您应该能够轻松地将代码迁移到 SQL Server CE

【讨论】:

  • 感谢您的回答。我使用VS2013。 SDK 安装正确,因为我之前已经在 LocalDB 实例中使用过它并且它工作正常。我只尝试更改为 CE,但现在它没有编译代码,当然我必须从使用 SqlSyncScopeProvisioning 到现在使用 SqlCeSyncScopeProvisioning 进行调整。我也使用 SQL Compact 3.5,因为最新的同步框架不支持 4.0。所有 DLL 都添加到解决方案中。
  • @juergend 更新了我的答案
  • 使用 Microsoft.Synchronization.Data.SqlServerCe.dll 的 3.1 版而不是 3.5 版为我解决了这个问题。我没有尝试使用 Compact 4.0,因为您可以在不同的网站上看到它不受支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多