我想创建一个Windows应用程序使用VS 2010中的C#将同步两个数据库,其中一个数据库是本地机器和另一台服务器上。这是我的示例代码。同步SQL Server 2008 R2(在本地服务器上运行)与Microsoft SQL服务器(在Plesk面板服务器数据库上运行)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;
namespace ExecuteExpressSync
{
class Program
{
static void Main(string[] args)
{
SqlConnection clientConn = new SqlConnection(@" Data Source=...; Initial Catalog= SqlServerSyncDb; Network Library=;Connection Timeout=15;Packet Size=4096;Integrated Security=no;User ID=.....;Password=....;Encrypt=no;");
SqlConnection serverConn = new SqlConnection("Data Source=(local); Initial Catalog=SyncDB; Integrated Security=True");
var providerl = new SqlSyncProvider("scopel", serverConn);
var provider2 = new SqlSyncProvider("scopel", clientConn);
// corvfig
PrepareServerForProvisioning(providerl);
PrepareClientForProvisioning(provider2, serverConn);
//sync
SyncOrchestrator sync = new SyncOrchestrator();
sync.LocalProvider = providerl;
sync.RemoteProvider = provider2;
//((SqlCeSyncProvider)sync.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
SyncOperationStatistics syncStats = sync.Synchronize();
// print statistics
Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
Console.WriteLine(String.Empty);
}
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
// display conflict type
Console.WriteLine(e.Conflict.Type);
// display error message
Console.WriteLine(e.Error);
}
private static void PrepareServerForProvisioning(SqlSyncProvider provider)
{
SqlConnection connection = (SqlConnection)provider.Connection;
SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning(connection);
if (!config.ScopeExists(provider.ScopeName))
{
DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(provider.ScopeName);
scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable("Products", connection));
scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable("Orders", connection));
config.PopulateFromScopeDescription(scopeDesc);
config.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
config.Apply();
}
}
private static void PrepareClientForProvisioning(SqlSyncProvider provider, SqlConnection sourceConnection)
{
SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning((SqlConnection)provider.Connection);
if (!config.ScopeExists(provider.ScopeName))
{
DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(provider.ScopeName, sourceConnection);
config.PopulateFromScopeDescription(scopeDesc);
config.Apply();
}
}
}
}
当我在同一台机器上运行的两个数据库上使用相同的代码时,它完美地工作。但是,当我使用plesk面板服务器数据库时出现错误,说您的数据库没有配置。当我打开服务器数据库时,我看到表已创建,但没有数据。另一件事是,每当我试图查看表格数据时,它会说“索引超出数组[Microsoft.SqlServer.Smo]”。
请建议做些什么。在此先感谢
在您的plesk面板数据库中,在哪个架构下创建了Sync Fx对象(即dbo.scope_info或userx.scope_info?) – JuneT
它是userx.scope。 –