用OpenQQ即时高效同步数据
在多用户协同工作的情况下,如果某用户修改数据后保存,其他用户只有重新加载才能看到最新的数据,参考:数据同步
实际上大多数程序,都是这种被动刷新的方式,例如你在使用网银的时候,只有刷新页面,才能看到刚刚发生的交易;在论坛浏览帖子的时候,只有刷新页面,才能看到他人刚发表的帖子。
也有一些程序,是定时刷新,不管数据有没有变动,到了一定时间,都重新加载数据。
但是上述方式,都没有办法做到即时同步,而且这些方式并非只刷新已经变动的数据,而是重新加载整个页面、甚至整个表,大大增加了服务器的负担,既不即时,也不高效。
有了OpenQQ,我们可以保存某行数据后,通知其他好友,这一行的数据有变化,请重新加载,这样就能做到即时、高效了。
设计步骤:
1、在编辑窗口加一个保存按钮,按钮代码设置为:
Dim
r As
Row = Tables("表A").Current
Dim
p As
String = IIF(r.DataRow.RowState
= DataRowState.Added,
"A#", "U#")
r.Save()
'一定要在保存后合成信息,因为新增行的主键在保存后才生成
Dim
msg As
String = p
&
"表A"
& "#"
& r("_Identify")
For
Each bd
As QQBuddy
In QQClient.Buddies
If bd.Online
Then
QQClient.Send(bd.name,
msg)
End
If
Next
这段代码用于合成通知信息发送给好友,例如"U#表A#8"表A主键为8的行发生了修改,"A#表A#10"表示表A新增了1行,新增行的主键为10。
你可以任意定义这种格式的通知。
2、再增加一个删除按钮,按钮代码设置为:
Dim
r As
Row = Tables("表A").Current
Dim
msg As
String = "D#"
&
"表A"
& "#"
& r("_Identify")
r.Delete()
Tables("表A").Save()
For
Each bd
As QQBuddy
In QQClient.Buddies
If bd.Online
Then
QQClient.Send(bd.name,
msg)
End
If
Next
这段代码用于删除行后合成通知信息发送给好友,例如"D#表A#8"表A主键为8的行被删除了。
3、在QQClient的ReceivedMessage事件中修改代码:
Dim
msg As
String = e.Message
If
msg.StartsWith("U#")
Then '表示修改了某行
Dim pts()
As String =
msg.Split("#")
If pts.Length
= 3 Then
Dim dr
As DataRow =
DataTables(pts(1)).Find("[_Identify]
= " & pts(2))
If dr
IsNot
Nothing Then
dr.Load()
'重新加载此行
End If
End
If
ElseIf
msg.StartsWith("A#")
Then '表示增加了行
Dim pts()
As String =
msg.Split("#")
If pts.Length
= 3 Then
DataTables(pts(1)).AppendLoad("[_Identify]
= " & pts(2))
'追载新增加的行.
End
If
ElseIf
msg.StartsWith("D#")
Then '表示删除了行
Dim pts()
As String =
msg.Split("#")
If pts.Length
= 3 Then
DataTables(pts(1)).RemoveFor("[_Identify]
= " & pts(2))
'移除行
End
If
End
If
这样,多用户环境下,任何一个客户端做的修改、增加,删除,保存后都会立即体现在其他客户端上。