7

我即将编写一个 ews-application 以将交换与另一个日历程序连接起来。我发生了什么事,我怎么知道,哪些约会在交换时被删除?有没有办法告诉?我在 API 和文档中找不到它。

提前致谢。

4

2 回答 2

7

根据用户删除约会(或任何项目)的方式,会做不同的事情:

  • 软删除:该项目被移动到邮箱的回收站。
  • 硬删除:该项目被立即删除。

您可以通过多种方式获取有关已删除项目的信息:

  • 使用 FindItems 调用查询文件夹并在 ItemView 的 Traversal 属性中选择 ItemTraversal.Associated。注意:这需要 Exchange 2010。
  • 一次使用 SyncFolderItems 并将同步 cookie 存储在某处。稍后,使用之前存储的 cookie 再次执行 SyncFolderItems。Exchange 现在将为您提供文件夹发生更改的详细列表。
  • 在回收站中查询约会。它们很可能来自用户的默认日历。
于 2011-09-15T10:10:26.787 回答
0

我编写了一个将 EWS 日历约会同步到 Sql 表的服务。

对于插入/更新更改后的删除,如果数据库中有一行而不是 EWS,我将删除它,因为这意味着它已在 Exchange 中删除。我使用 GUID 来跟踪数据库和交换中的约会。Exchange Web 服务:为什么 ItemId 不恒定?[继续]

只需几十次约会,性能就不错,我将在更大的数据集上进行尝试。

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
于 2014-05-13T18:42:02.567 回答