您的位置:首页 > 数据库

winform与数据库同步更新

2010-10-29 21:46 274 查看
在.net中通常会遇到这样的需求,就是要将数据库中最新的数据同步显示在winform中,总结一下可以实现的几种方法。

自己也尝试了一段时间,结合网上其他前辈的指点,大致有以下几种方法可以实现(仅个人观点)

(1)timer轮询

可以说这是中最普遍、最容易被想到的方法,大致的思路—>在winform中定义一个timer,设置完时间间隔后可以通过start(或是
Enable)启动时间触发器。每隔一段时间去访问一次数据库,查询出最新的数据显示在winform的控件上,这样就OK了。在容易操作的背后却有着很
大的缺陷,频繁且直接和数据库的交互势必会造成数据库端始终占用着大量的资源,如果对于一般配置的电脑,这样操作不太理想,当然,在网上也看到一些公司用
这种方法同步更新数据库。方法可用却不实用。

(2)sql触发器

利用sql触发器可以有两种方法实现

①触发器中将新插入的数据即inserted查询出来的数据并接成字符串转换成文件流写入到某个文件中(.txt),在winform中用文件监视器监视
文件的变动,从而得到最新的数据显示在控件中。好像不太多的人用这种方式来实现,涉及到创建文件的权限问题,而且,既然已经想到用"消息"的形式将插入的
数据"发送"出去,何必不再多想一步,借助网络编程实现,即下面提到的方法

②这种方法很类似于上面的方法,在sql表的触发器中将数据作为消息socket发送出去,winform端listener,有新消息的时候在控件中显
示该新消息,当然这种方法的资源消耗比timer轮询有很大的改善,数据包的丢失和网络断连后重新启动监听需要考虑。

目前知道的就这几种方法,如果大家还有其他的方法,望不吝赐教。

@scott_zhou

timer轮询我相信不需要介绍的。重点讲讲socket发送消息吧

UdpClient client = new UdpClient(Port);

IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.21"), Port);

client.EnableBroadcast = true;

Byte[] sendBytes = Encoding.Default.GetBytes("dukeyongwang");

client.Send(sendBytes, sendBytes.Length, iep);

client.Close();

把上面发送消息的代码编译成DLL,并注册。然后在SQL中调用DLL,完成消息的发送。在SQL2000中要借助存储过程调用DLL,在SQL2005以上的版本中可以直接在触发器中调用DLL。以下是存储过程中的代码

exec @err = sp_OACreate 'udpClient.udpSendMsg',@obj out --引用DLL

exec @err = sp_OAMethod @obj,'sendMessage',@result out,@param--调用方法

exec sp_OADestroy @obj --销毁

最后就是接受消息端了:

udpClient = new UdpClient(Port);

groupEP = new IPEndPoint(IPAddress.Any, Port);//监听端口

byte[] bytes = udpClient.Receive(ref groupEP);

string msg = ASCIIEncoding.Default.GetString(bytes);

这样就足以实现数据库同步更新!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: