我想創建一個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。 –