我查了些资料,也写了一些程序,但效果都不理想,特来向各位兄弟求救。以下是我的一些方法:
1、建立一个线程,在里面轮循查看该表的内容:
while not terminated do
begin
//查询
end;
优点:能比较快速的知道数据的更新。
缺点:线程打开后,不管表有没有更新,cpu基本在100%,太不经济2、在主程序中用TIMER轮循,我觉得还不如上面的好。3、在触发器中使用 xp_cmdshell 存储过程,执行命令行,通知程序。
这个我不会,还请那位老大详细指点一下啊4、我想不出别的方法了,兄弟们有什么经验,多赐教啊!
1、建立一个线程,在里面轮循查看该表的内容:
while not terminated do
begin
//查询
end;
优点:能比较快速的知道数据的更新。
缺点:线程打开后,不管表有没有更新,cpu基本在100%,太不经济2、在主程序中用TIMER轮循,我觉得还不如上面的好。3、在触发器中使用 xp_cmdshell 存储过程,执行命令行,通知程序。
这个我不会,还请那位老大详细指点一下啊4、我想不出别的方法了,兄弟们有什么经验,多赐教啊!
现在我用的就是楼主所说的第一种方式
但感觉这样的方式不是最好的
如果表中没有要的记录,也会不停地去查询是否有数据
第3种方式我也想过,但好像要C写的Dll才能用上,也是比较麻烦!
希望有更好的建议!
begin
...
Sleep(n);
end;
xp_cmdshell
以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。说明 在 Microsoft® Windows® 95 或 Microsoft Windows 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。
语法
xp_cmdshell {'command_string'} [, no_output]参数
'command_string'是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(255) 或 nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。no_output是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。返回代码值
0(成功)或 1(失败)
sql server里弄个触发器调用xp_cmdshell比较简单,但是性能很差,最好是自己做xp dll,以前弄过,如果过程了需要访问数据库或者过程有参数的话,要一个头文件,好像是dblib,然后像普通dll那样做,做好了以后,sqlserver这边好像要调用一个过程来安装这个扩展过程,像你的情况,可能不需要参数,也就可能不需要那个头文件,你在函数里可以给预先约定的命名事件发信号,然后在触发器里调用这个扩展过程,另一边你的监视程序等待事件的信号就可以了,说来容易,做起来总有点麻烦,喀喀
每次读取当前表的大小,和INI中的大小比较,发生变化,就可以确定是否被修改过了。以前我写过这种东西,回去找找。写的简单,找到代码后,一定补上!!
我看adoquery有些如afterinsert,onRecordChangeComplete等事件,不知道怎么用。
我把一个DBgrid连接到adoquery(或adotable)上,actives
active设为true,在查询分析器里insert,但dbgrid根本没什么反映,afterinsert,onRecordChangeComplete写的代码也不执行
在应用程序中定义一个事件,由特定消息触发,在事件里查询数据库,读出新记录。
在数据库表中写一个触发器for insert,里面实现发送特定消息给应用程序。
现在关键是这个触发器怎么写,应该是调用xp_cmdshell,我看了些资料要写个dll,在dll里实现。不过这个没做过啊,希望那位老大能费点时间,研究一下,彻底解决这个问题呀,我可以再加100分。
1:一定要服务器方即server主动通知client,这样才可以减少无谓的搜索时间,节约资源。
你可以研究一下socket通讯,我认为socket通讯的实现方式应该就是这种模式
不过现在想想,实现方法应该和楼主的第二种观点差不多
不过正如你说的,这样一来,数据的实时性又不好/
http://www.wyx2008.com/mxj/system/netmove/netmove.rar
http://www.wyx2008.com/mxj
我这里有个程序 实现的是 在两个sql 数据库间实时同步数据的,
用的方法跟楼主的第一种方法差不多,不过CPU不高的
楼主可以参考下
1.首先设置一个表,结构为CheckEdit(用户名, 更新标志)
2.设置一个触发器,当查询的表有更新时,就更新上面建的表
3.采用楼主的第二种方法,循环查询这个表(因为这张表只有几条数据,查询速度应该很快)实现方法:
1.当用户登陆时,设置CheckEdit表中的更新标志为False
2.如果表有修改,在SQL触发器中,设置CheckEdit表中的更新标志为True
3.用Timer检测这只是我当当一时想到的思路,请楼主参考!
没什么技术含量,所以,当时作完也没备份其实,到了 SQL server 2005 就可以比较完美的解决,据说有何Oracle一样的数据库触发器
我当时,有两种解决方法,一种就是在触发器中用 xp_cmdshell 调用自己编写的程序,通知发生改变;一种就是如楼上所说,有变化,触发器 就 更改一个指定表对应的数据表名的那个栏目到当前时间,客户端再定时查询,这个,其实反而效率好点,虽然不及时
看来还是SQL server 2005 好