SqlCeReplication.EndSynchronize 方法
结束一个通过调用 BeginSynchronize 方法启动的异步数据同步。
命名空间: System.Data.SqlServerCe
程序集: System.Data.SqlServerCe(在 system.data.sqlserverce.dll 中)
语法
声明
Public Sub EndSynchronize ( _
ar As IAsyncResult _
)
用法
Dim instance As SqlCeReplication
Dim ar As IAsyncResult
instance.EndSynchronize(ar)
public void EndSynchronize (
IAsyncResult ar
)
public:
void EndSynchronize (
IAsyncResult^ ar
)
public void EndSynchronize (
IAsyncResult ar
)
public function EndSynchronize (
ar : IAsyncResult
)
不适用。
参数
- ar
BeginSynchronize 方法返回的 IAsyncResult 接口。
备注
应当在同步完成时调用此函数来检测在异步数据同步期间发生的错误。如果同步失败,此函数引发一个反映同步错误的 SqlCeException。此函数通常是从用户委托调用的;同步完成时会自动调用用户委托。
有关在 SQL Server Compact Edition 中实现异步数据同步的信息,请参见 SQL Server Compact Edition Books Online(《SQL Server Compact Edition 联机丛书》)中的“Asynchronous Data Synchronization”(异步数据的同步)。
示例
下面的示例演示如何设置 SQL Server Compact Edition 复制以执行异步数据同步。
' Imports System;
' Imports System.Data;
' Imports System.IO;
' Imports System.Data.SqlServerCe;
' Imports System.Windows.Forms;
'/ <summary>
'/ Demonstrates the usage of asynchronous database synchronization
'/ </summary>
Public Class MyForm
Inherits Form
Private myUserInterfaceUpdateEvent As EventHandler
Private tableName As String
Private percentage As Integer
Private eventStatus As SyncStatus
Private repl As SqlCeReplication
Friend Enum SyncStatus
PercentComplete
BeginUpload
BeginDownload
SyncComplete
End Enum 'SyncStatus
Public Sub New()
' InitializeComponent();
Me.myUserInterfaceUpdateEvent = New EventHandler(AddressOf UserInterfaceUpdateEvent)
End Sub 'New
Private Sub UserInterfaceUpdateEvent(ByVal sender As Object, ByVal e As System.EventArgs)
Select Case Me.eventStatus
Case SyncStatus.BeginUpload
'this.labelStatusValue.Text = "Began uploading table : " & tableName;
Case SyncStatus.PercentComplete
'this.labelStatusValue.Text = "Sync with SQL Server is " & percentage.ToString() & "% complete.";
Case SyncStatus.BeginDownload
'this.labelStatusValue.Text = "Began downloading table : " & tableName;
Case SyncStatus.SyncComplete
'this.labelStatusValue.Text = "Synchronization has completed successfully";
'this.labelLastSyncValue.Text = GetLastSuccessfulSyncTime().ToString();
End Select
End Sub 'UserInterfaceUpdateEvent
Public Sub SyncCompletedCallback(ByVal ar As IAsyncResult)
Try
Dim repl As SqlCeReplication = CType(ar.AsyncState, SqlCeReplication)
repl.EndSynchronize(ar)
repl.SaveProperties()
Me.eventStatus = SyncStatus.SyncComplete
Catch e As SqlCeException
MessageBox.Show(e.Message)
Finally
' NOTE: If you'd like to set Control properties from within this
' method, you need to use Control.Invoke method in order to marshal
' the call to the UI thread; otherwise you might deadlock your
' application; See Control.Invoke documentation for more information
'
Me.Invoke(Me.myUserInterfaceUpdateEvent)
End Try
End Sub 'SyncCompletedCallback
Public Sub OnStartTableUploadCallback(ByVal ar As IAsyncResult, ByVal tableName As String)
Me.tableName = tableName
Me.eventStatus = SyncStatus.BeginUpload
' NOTE: If you'd like to set Control properties from within this
' method, you need to use Control.Invoke method in order to marshal
' the call to the UI thread; otherwise you might deadlock your
' application; See Control.Invoke documentation for more information
'
Me.Invoke(Me.myUserInterfaceUpdateEvent)
End Sub 'OnStartTableUploadCallback
Public Sub OnSynchronizationCallback(ByVal ar As IAsyncResult, ByVal percentComplete As Integer)
Me.percentage = percentComplete
Me.eventStatus = SyncStatus.PercentComplete
' NOTE: If you'd like to set Control properties from within this
' method, you need to use Control.Invoke method in order to marshal
' the call to the UI thread; otherwise you might deadlock your
' application; See Control.Invoke documentation for more information
'
Me.Invoke(Me.myUserInterfaceUpdateEvent)
End Sub 'OnSynchronizationCallback
Public Sub OnStartTableDownloadCallback(ByVal ar As IAsyncResult, ByVal tableName As String)
Me.tableName = tableName
Me.eventStatus = SyncStatus.BeginDownload
' NOTE: If you'd like to set Control properties from within this
' method, you need to use Control.Invoke method in order to marshal
' the call to the UI thread; otherwise you might deadlock your
' application; See Control.Invoke documentation for more information
'
Me.Invoke(Me.myUserInterfaceUpdateEvent)
End Sub 'OnStartTableDownloadCallback
Private Sub ButtonSynchronize_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Try
Me.repl = New SqlCeReplication()
repl.SubscriberConnectionString = "Data Source=Test.sdf"
If False = File.Exists("Test.sdf") Then
repl.AddSubscription(AddOption.CreateDatabase)
repl.PublisherSecurityMode = SecurityType.DBAuthentication
repl.Publisher = "MyPublisher"
repl.PublisherLogin = "PublisherLogin"
repl.PublisherPassword = "<Password>"
repl.PublisherDatabase = "AdventureWorksDW"
repl.Publication = "AdventureWorksDW"
repl.InternetUrl = "https://www.adventure-works.com/sqlmobile/sqlcesa30.dll"
repl.InternetLogin = "InternetLogin"
repl.InternetPassword = "<Password>"
repl.Subscriber = "MySubscriber"
Else
repl.LoadProperties()
End If
Dim ar As IAsyncResult = repl.BeginSynchronize( _
New AsyncCallback(AddressOf Me.SyncCompletedCallback), _
New OnStartTableUpload(AddressOf Me.OnStartTableUploadCallback), _
New OnStartTableDownload(AddressOf Me.OnStartTableDownloadCallback), _
New OnSynchronization(AddressOf Me.OnSynchronizationCallback), repl)
Catch ex As SqlCeException
MessageBox.Show(ex.Message)
End Try
End Sub 'ButtonSynchronize_Click
Public Function GetLastSuccessfulSyncTime() As DateTime
Dim utcDateTime As DateTime
Dim localDateTime As DateTime
Dim conn As SqlCeConnection = Nothing
Dim cmd As SqlCeCommand = Nothing
Try
conn = New SqlCeConnection("Data Source = Test.sdf")
conn.Open()
cmd = conn.CreateCommand()
cmd.CommandText = "SELECT LastSuccessfulSync FROM __sysMergeSubscriptions " & _
"WHERE Publication=@publication"
cmd.Parameters.Add("@publication", SqlDbType.NVarChar, 4000)
cmd.Parameters("@publication").Value = "AdventureWorksDW"
utcDateTime = CType(cmd.ExecuteScalar(), DateTime)
localDateTime = utcDateTime.ToLocalTime()
Return localDateTime
Finally
conn.Close()
End Try
End Function 'GetLastSuccessfulSyncTime
End Class 'MyForm
// using System;
// using System.Data;
// using System.IO;
// using System.Data.SqlServerCe;
// using System.Windows.Forms;
/// <summary>
/// Demonstrates the usage of asynchronous database synchronization
/// </summary>
public class MyForm : Form
{
private string tableName;
private int percentage;
private SyncStatus eventStatus;
private SqlCeReplication repl;
private EventHandler myUserInterfaceUpdateEvent;
internal enum SyncStatus
{
PercentComplete,
BeginUpload,
BeginDownload,
SyncComplete
}
public MyForm()
{
// InitializeComponent();
this.myUserInterfaceUpdateEvent = new EventHandler(MyUserInterfaceUpdateEvent);
}
private void MyUserInterfaceUpdateEvent(object sender, System.EventArgs e)
{
switch (this.eventStatus)
{
case SyncStatus.BeginUpload:
//this.labelStatusValue.Text = "Began uploading table : " + tableName;
break;
case SyncStatus.PercentComplete:
//this.labelStatusValue.Text = "Sync with SQL Server is " + percentage.ToString() + "% complete.";
break;
case SyncStatus.BeginDownload:
//this.labelStatusValue.Text = "Began downloading table : " + tableName;
break;
case SyncStatus.SyncComplete:
//this.labelStatusValue.Text = "Synchronization has completed successfully";
//this.labelLastSyncValue.Text = GetLastSuccessfulSyncTime().ToString();
break;
}
}
public void SyncCompletedCallback(IAsyncResult ar)
{
try
{
SqlCeReplication repl = (SqlCeReplication)ar.AsyncState;
repl.EndSynchronize(ar);
repl.SaveProperties();
this.eventStatus = SyncStatus.SyncComplete;
}
catch (SqlCeException e)
{
MessageBox.Show(e.Message);
}
finally
{
// NOTE: If you'd like to set Control properties from within this
// method, you need to use Control.Invoke method in order to marshal
// the call to the UI thread; otherwise you might deadlock your
// application; See Control.Invoke documentation for more information
//
this.Invoke(this.myUserInterfaceUpdateEvent);
}
}
public void OnStartTableUploadCallback(IAsyncResult ar, string tableName)
{
this.tableName = tableName;
this.eventStatus = SyncStatus.BeginUpload;
// NOTE: If you'd like to set Control properties from within this
// method, you need to use Control.Invoke method in order to marshal
// the call to the UI thread; otherwise you might deadlock your
// application; See Control.Invoke documentation for more information
//
this.Invoke(this.myUserInterfaceUpdateEvent);
}
public void OnSynchronizationCallback(IAsyncResult ar, int percentComplete)
{
this.percentage = percentComplete;
this.eventStatus = SyncStatus.PercentComplete;
// NOTE: If you'd like to set Control properties from within this
// method, you need to use Control.Invoke method in order to marshal
// the call to the UI thread; otherwise you might deadlock your
// application; See Control.Invoke documentation for more information
//
this.Invoke(this.myUserInterfaceUpdateEvent);
}
public void OnStartTableDownloadCallback(IAsyncResult ar, string tableName)
{
this.tableName = tableName;
this.eventStatus = SyncStatus.BeginDownload;
// NOTE: If you'd like to set Control properties from within this
// method, you need to use Control.Invoke method in order to marshal
// the call to the UI thread; otherwise you might deadlock your
// application; See Control.Invoke documentation for more information
//
this.Invoke(this.myUserInterfaceUpdateEvent);
}
private void ButtonSynchronize_Click(object sender, System.EventArgs e)
{
try
{
this.repl = new SqlCeReplication();
repl.SubscriberConnectionString = "Data Source=Test.sdf";
if (false == File.Exists("Test.sdf"))
{
repl.AddSubscription(AddOption.CreateDatabase);
repl.PublisherSecurityMode = SecurityType.DBAuthentication;
repl.Publisher = "MyPublisher";
repl.PublisherLogin = "PublisherLogin";
repl.PublisherPassword = "<Password>";
repl.PublisherDatabase = "AdventureWorksDW";
repl.Publication = "AdventureWorksDW";
repl.InternetUrl = "https://www.adventure-works.com/sqlmobile/sqlcesa30.dll";
repl.InternetLogin = "MyInternetLogin";
repl.InternetPassword = "<Password";
repl.Subscriber = "MySubscriber";
}
else
{
repl.LoadProperties();
}
IAsyncResult ar = repl.BeginSynchronize(
new AsyncCallback(this.SyncCompletedCallback),
new OnStartTableUpload(this.OnStartTableUploadCallback),
new OnStartTableDownload(this.OnStartTableDownloadCallback),
new OnSynchronization(this.OnSynchronizationCallback),
repl);
}
catch (SqlCeException ex)
{
MessageBox.Show(ex.Message);
}
}
public DateTime GetLastSuccessfulSyncTime()
{
DateTime utcDateTime;
DateTime localDateTime;
SqlCeConnection conn = null;
SqlCeCommand cmd = null;
try
{
conn = new SqlCeConnection("Data Source = Test.sdf");
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "SELECT LastSuccessfulSync FROM __sysMergeSubscriptions " +
"WHERE Publication=@publication";
cmd.Parameters.Add("@publication", SqlDbType.NVarChar, 4000);
cmd.Parameters["@publication"].Value = "AdventureWorksDW";
utcDateTime = (DateTime)cmd.ExecuteScalar();
localDateTime = utcDateTime.ToLocalTime();
return localDateTime;
}
finally
{
conn.Close();
}
}
}
平台
Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
Windows Vista、Microsoft Windows XP SP2 和 Windows Server 2003 SP1 支持 Microsoft .NET Framework 3.0。
版本信息
.NET Framework
受以下版本支持:3.0
.NET Compact Framework
受以下版本支持:2.0
请参见
参考
SqlCeReplication 类
SqlCeReplication 成员
System.Data.SqlServerCe 命名空间