I wrote a service that synchronizes EWS calendar appointments in an Sql table.
To delete after inserting / updating changes, if there is a row in the database, and not in EWS, I will delete it, as this means that it was deleted in Exchange. I use a GUID to track destination in a database and share. Web Services Exchange: Why is ItemId Not a Constant? [Continued]
Decent performance with dozens of assignments, I'll try it on a much larger dataset.
Dim appointmentGuid As New List(Of String) For Each appointment In appointments 'appointments is IEnumerable(Of Appointment) from EWS Dim guid As String = GetGuidForAppointment(appointment) If String.IsNullOrEmpty(guid) Then SetGuidForAppointment(appointment) guid = GetGuidForAppointment(appointment) End If appointmentGuid.Add(guid) 'Upsert rows ... Next 'Delete orphaned rows Using sqlConnection As New SqlConnection(ConnectionString) Dim deleteScript As New StringBuilder() Using sqlCmd As New SqlCommand("SELECT ID FROM Appointments", sqlConnection) Using sqlDataReader As SqlDataReader = sqlCmd.ExecuteReader() sqlConnection.Open() While sqlDataReader.Read() Dim guid As String = sqlDataReader.GetString(0) If Not appointmentGuid.Contains(guid) Then deleteScript.AppendFormat("DELETE FROM Appointments WHERE ID = '{0}'; ", guid) End If End While End Using End Using If deleteScript.Length > 0 Then Using sqlCmd As New SqlCommand(deleteScript.ToString(), sqlConnection) sqlCmd.ExecuteNonQuery() End Using End If End Using
Brent
source share