离线客户端,数据库是access,服务端是sql server现在的情况是,客户端先通过vpn连接从服务端sql server中取得数据;客户端access中的大批量数据在离线状态处理完毕后,通过vpn连接把数据回传给服务端。系统已经初步完成,但是发现设计的时候的一个缺陷,就是在数据回传的时候原来的做法是把本地全部数据回传给sever的。现在想改成只回传更改过的数据。有办法利用vb+ado+access实现数据库触发器的功能吗?或者是不大量改动系统设计的情况下实现确定哪些记录是被更改过的。涉及的表很多个!

解决方案 »

  1.   

    不要在表里加,在程序里加,temp%,temp=0 未改,temp=1 改过。if temp=1 then ...
      

  2.   

    就是在数据回传的时候原来的做法是把本地全部数据回传给sever的。现在想改成只回传更改过的数据。建议还是在表里设定标志,这样会好一些,数据出错的机会少一些
    直接使用sql语句
    这个在设计的时候你应该想到啊
      

  3.   

    在本地access表中加一个修改标志字段用来标志是否更改,其默认值为0,修改过变为1
    注意是在本地access表中加
    然后回传的时候只选择标志字段为1的数据
    这样应该变动不大呀?
      

  4.   

    我觉得在本地ACCESS上传的时候,上传一条记录后就删除一条记录,这样的话即使没有传完,下次再传的时候也不用判断,且要上传的记录也会少很多。
      

  5.   

    在本地access表中加一个修改标志字段用来标志是否更改,其默认值为0,修改过变为1
    注意是在本地access表中加
    然后回传的时候只选择标志字段为1的数据同意!
      

  6.   

    这个题目显然是属于数据同步方面的问题,我也曾经做过一些相关的考虑。我认为在较小的代价下,仅仅通过对底层模块的一些修改,而不修改任何应用程序代码,实现你需要的功能是完全可能的。
    以下的讨论基于两个前提:
    1。你对ACCESS数据库的操作是通过ADO实现的;
    2。你的数据同步内容不能包含二进制类型的信息,如图片和声音等,如果你需要处理此类信息,
    就不能完全通过对底层模块的修改实现,必须对相关的应用代码进行针对性的修改了。绕来绕去说了半天,我的具体做法可以简要描述如下:
    通过继承 ADODB 的 RecordSet 对象和 Connection 对象,在实现其原有功能的同时,将附加的变更组装成SQL语句,
    写入到一个新的ACCESS数据库。
    当然,VB中没有继承。那么我们只能使用聚合来替代继承了。这是MICROSOFT的标准说法。具体的方法是:
    1。创建一个ACTIVEX DLL,取名为 MYADO,添加至少两个类模块,RecordSet和Connection;
    2。在MYADO.Connection对象中,添加一个内部变量mConnection,类型为ADODB.Connection;对于RecordSet也同样;
    3。在这个两个类模块中,先原封不动地实现其原对象的主要方法;
    4。在你的应用程序中,引用MYADO,然后将所有Adodb替换为MyADO;这里你可以测试一下,是否你原来的功能都可以无障碍地实现。
    下面开始添加功能了。你用ADO在VB中对数据库进行数据写入,能够使用的方式无非两种:
    1。通过SQL语句,包括INSERT/DELETE/UPDATE;当然,这是通过CONNECTION对象的EXECUTE方法来实现的。
    2。通过动态结果集,使用其 ADDNEW/DELETE/UPDATE 方法。当然,我认为完全使用第一种方法来实现数据写入的人可能现在已经不多了吧。但是,你要看到,如果你是使用第一种方法
    来使用数据写入,那么你的困难就会小了很多。你只需要修改Connection的Execute方法就可以了:public Function Execute(strSQL AS string) as RecordSet
        set Execute=mConn.Execute(strSQL)
        
        '判断SQL语句的开头不是SELECT
        '打开你用于保存更改数据的数据库,其中只有一个tblSQL表,里面只有一个字段sSQL来存SQL语句就可以
        '把这句SQL保存进去
    End Function这样就好了。你只要将这个变更数据库上传,将其中储存的SQL语句直接拿出来执行就完了。如果你原来是使用第二种方法来实现数据写入,那么就要麻烦许多了。你需要重载RecordSet的Field.Value属性的LET,
    以及UPDATE/DELETE这两个方法。具体我就不写了,毕竟这里只是给你思路么。在这种情况下,你可以考虑在更改数据库
    中不是建一个表来保存还原的SQL语句,而是按照RECORDSET的结构建相同的表,来保存数据。总结一下:这就是从底层模块着手,实现类似触发器功能的方法。