在标题中,我正在使用C#和WPF开发一个应用程序,它在许多计算机上充当客户端,并在公司内使用SQL处理数据。当一个人从服务器的数据库中添加或删除某些内容时,我希望它使用此应用程序刷新所有计算机上项目的视图。我知道我可能需要使用SQL触发器,但我有点困惑从哪里开始。
就是这种想法:
private void Timer_Tick(object sender, EventArgs e)
{
if (trigger1.triggered == true)
{
RefreshView();
trigger1.triggered == false;
}
}
答案 0 :(得分:0)
它不是你想要的触发器。它是Query Notification。
答案 1 :(得分:0)
SQL触发器在数据库中发生某些事件时发生,并允许您执行诸如删除表中没有外键的相关行以保持数据完整性的操作。我不认为它们会在这里带来任何好处,因为它们的目的是在数据库中而不是在外部进行。
您的请求和建议的执行方式的问题在于它可能会导致大量网络流量。如果你没有问题,一种方法是使用时间戳。记录更改时,将新时间戳保存在数据库中。
现在,在每台计算机上的计时器中,检查自上次检查后时间戳是否已更改。如果有,请重新加载数据。如果没有,继续运行。
但是,有很多事情要考虑这个命题。例如,如果屏幕上的数据发生了变化但是在其他人更改时未保存,该怎么办?你输了吗?您是否列出了更改并询问该怎么做?您是否真的有权进行这些更改,还是需要管理员批准?
使用乐观锁定(写入的最后一条记录是正确的)在保存时检查碰撞而不是轮询更改会更正常。这样一来,网络流量就会减少,但是你会被告知自你加载记录后记录是否发生了变化,并给出了如何继续的可用选项。
对于记录列表,避免巨大网络流量的简单方法是使用一个简单的刷新按钮来重新加载列表。
本文可能会为您提供有关确保多用户环境中数据完整性的一些建议:https://www.codeproject.com/Articles/1178358/What-You-See-Is-What-You-Update
我希望这能让你有所思考。
答案 2 :(得分:0)
我想要做的是避免在刷新时调用该方法,因为正如#oldcoder所说,网络流量将不必要地大。刚想到像pc1这样的INSERT - > DB - >将有关插入的信息发送到pc2,pc3。如果这不可能或太复杂,我将每隔10秒左右刷新一次该功能。