sqlserver应该是有某种触发机制可以调用外部程序的只是听别人说过,没研究过

解决方案 »

  1.   

    除了SQLServer,不知Oracle、DB2和MySql是否也是有相应的表改变事件进行通知外部程序?
    请有研究过的@我哈。
    我们项目用到了这四个数据库,用的是主动查询,虽然能达到目的,但一点儿不优雅,我一直耿耿于怀。
    对于楼主的问题,如果不能用主动通知来实现,可以表中添加自动增长的ID,每次检索时应检索ID大于上次检索后最大ID的记录,效率应该不会太大。
      

  2.   

    同意楼上做法,使用检索id,每次加载的时候记录当前的id然后查询表内的最大id进行比较
      

  3.   

    不需要把对数据库的操作设置为实时的就可以了。WEB有更新就去更新串口,串口有数据来的时候可以先缓存起来啊,设一个条件,满足条件时才去更新数据库
      

  4.   


    多谢,也是一个思路,对于表的操作非常复杂。有添加、删除、修改操作。而且不是一个表,有多个。
    目前的做法是:
      1)web每次修改后,设置一个修改标志,比如为ture,负责通讯的程序根据读取的每条记录的标志去判断。
            等操作完成后,再将标志设置为false。
      
      

  5.   

    你没看明白一个地方
    楼主的模型:  
    通讯程序(串口)------>  数据库Sqlserver2005 <--------web监测 组成
      
    推荐模型 :
    通讯程序(串口)-------->   实时数据 ------>  数据库Sqlserver2005 <--------web监测 组成通讯线程是不参与   数据库Sqlserver2005操作的 
    实时数据到数据库Sqlserver2005的转换和查表,是另外的线程来完成的
     web只是单纯的反应 Sqlserver2005 的数据状况的
    web是不必要直接向下位下达更新数据指令的           任何别人的实时数据库都是不靠谱的,因为任何一个人的实际工况都是不一样的
    如果做为一个程序员同时搞上了工控行业,不会实时数据库是要吃亏的
    一个简单的链表就可以是实时数据库,技术是没有难度的
                                  
      

  6.   

    还是没明白,请指教:
    1.通讯程序从下位机获取到数据,然后将数据保存到数据库;
    2.web定时读取数据库以获取数据进行显示;
    3.web修改数据库中某些值,并设置相应状态为TRUE;
    4.通讯程序不断读取数据库中相应状态为TRUE的记录;
    5.通讯程序下发相应命令。
    这个是楼主的模型吧,如果我没理解错的话。这个过程中如何利用实时数据库(或者原理)来改善?或者web与通讯程序不依靠数据库来传递消息,通讯程序直接与web联系,web上有任何修改,就直接发送给通讯程序,通讯程序再发送相应命令给下位机。
      

  7.   

    本方法一个:专门建立个表,设置更新状态,更新时,刷新这个状态。web监测时,只判断这个表的状态,决定刷不刷新
      

  8.   

    还是没明白,请指教:
    1.通讯程序从下位机获取到数据,然后将数据保存到数据库;
    2.web定时读取数据库以获取数据进行显示;
    3.web修改数据库中某些值,并设置相应状态为TRUE;
    4.通讯程序不断读取数据库中相应状态为TRUE的记录;
    5.通讯程序下发相应命令。
    这个是楼主的模型吧,如果我没理解错的话。这个过程中如何利用实时数据库(或者原理)来改善?或者web与通讯程序不依靠数据库来传递消息,通讯程序直接与web联系,web上有任何修改,就直接发送给通讯程序,通讯程序再发送相应命令给下位机。是的 目前程序工作方式就是这样 
      

  9.   

    该死的XP精简版,又无缘无故的把Ctrl键给按住了,导致一按回因就回帖了。
    还有第2点:
    看图中通讯线程和上位机程序是能够直接通信,如果真能这样实现,那么楼主的问题就不是问题了,上位机程序修改了任何东西,都可以直接发消息给通讯程序,然后通讯程序发指令给下位机,完全用不着通过数据库来中转。不知道楼主能否这样实现,若能这样实现,我也不知道这和实时数据库在什么关系。
      

  10.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。
      

  11.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。这是个办法:
    web和通讯程序通讯  实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录;如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢??
    还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。
    或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。
      

  12.   

    关键是  数据库如何给外部程序一个通知??不是数据库去通知,而是你的WebServer区通知。
      

  13.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。这是个办法:
    web和通讯程序通讯  实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录;如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢??
    还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。
    或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。我举个例子:报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行?
    比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。
    这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。
      

  14.   

    在web(IIS)未开启的情况下,请问通讯程序将操作数据库的结果放在哪里,才能让web再次开启就能访问到?在通讯程序进程空间内分配内存存链表,web开启后访问通讯程序内存的链表?通讯程序将链表数据放到硬盘文件上,然后web开启后访问这个文件?如果把链表放在内存中,是否要考虑程序突然崩溃而导致的数据丢失的情况?
      

  15.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。这是个办法:
    web和通讯程序通讯  实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录;如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢??
    还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。
    或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。我举个例子:报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行?
    比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。
    这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。======================================================
    那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。
      

  16.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。这是个办法:
    web和通讯程序通讯  实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录;如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢??
    还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。
    或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。我举个例子:报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行?
    比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。
    这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。======================================================
    那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。
    主动查询的方式怎么做都可以,就看你觉得那种方式简单。
      

  17.   


    当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。
    这样读取的表 少点。
    我倒觉得15的建议是个不错的选择。
    定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。
    变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。
    我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。这是个办法:
    web和通讯程序通讯  实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录;如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢??
    还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。
    或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。我举个例子:报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行?
    比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。
    这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。======================================================
    那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。
    主动查询的方式怎么做都可以,就看你觉得那种方式简单。
    实现肯定可以,就是说的效率问题。
      

  18.   

    Web开启动,自动读一次SQL数据
    Web开启后接到转换线程的通知就又读一次SQLWeb关闭了
    整个系统照常运行
    连这都看不懂,郁闷
      

  19.   

    Web就一显示数据用,就是所谓的上位
    普通数据从SQL取
    实时数据从实时数据库取
    最多必要的时候发一两个指令而已,指令发到指令队列就完了
    不知道老鸡巴去掺合整个系统的运行干毛
      

  20.   

    你把上面图片中的上位去掉
    并且把和他相关的线也去掉你自己看看,Web和他们又毛的关系
      

  21.   

    没有你所谓的实时数据库的概念。存储线程和通讯线程本来已经分开了。通过队列实现,一个添加,一个读取,然后删除。
    不知道你所谓的转换线程是不是这个意思?你的意思是 web定义后,直接通知通讯程序去读取?
    如果不用扩展存储过程,你用什么方法实现交互。