求救,进来看看吧!

vallan 2004-03-17 04:25:58
离线客户端,数据库是access,服务端是sql server

现在的情况是,客户端先通过vpn连接从服务端sql server中取得数据;客户端access中的大批量数据在离线状态处理完毕后,通过vpn连接把数据回传给服务端。

系统已经初步完成,但是发现设计的时候的一个缺陷,就是在数据回传的时候原来的做法是把本地全部数据回传给sever的。现在想改成只回传更改过的数据。

有办法利用vb+ado+access实现数据库触发器的功能吗?或者是不大量改动系统设计的情况下实现确定哪些记录是被更改过的。

涉及的表很多个!



...全文
32 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
myarts 2004-03-20
  • 打赏
  • 举报
回复
看你标题喊得这么让人可怜,我要是不表示一下就良心不安
本来我是100分之100的赞成上面的观点,就是在表里加判断字段
但是为了标新立异,本着多想点子出发,我还是再帮你出个主意
干脆把你的机器设成服务器让人家来传给你而不要你传给人家,就什么都不用管了!-:)

其实写程序的时候再麻烦一点,搞个记录日志,都帮你很多很多的忙
fisher007 2004-03-20
  • 打赏
  • 举报
回复
在本地access表中加一个修改标志字段用来标志是否更改,其默认值为0,修改过变为1
注意是在本地access表中加
然后回传的时候只选择标志字段为1的数据

同意!
lyhyp 2004-03-20
  • 打赏
  • 举报
回复
我觉得在本地ACCESS上传的时候,上传一条记录后就删除一条记录,这样的话即使没有传完,下次再传的时候也不用判断,且要上传的记录也会少很多。
daisy8675 2004-03-20
  • 打赏
  • 举报
回复
收下
junglerover 2004-03-20
  • 打赏
  • 举报
回复
这个题目显然是属于数据同步方面的问题,我也曾经做过一些相关的考虑。

我认为在较小的代价下,仅仅通过对底层模块的一些修改,而不修改任何应用程序代码,实现你需要的功能是完全可能的。
以下的讨论基于两个前提:
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的结构建相同的表,来保存数据。

总结一下:这就是从底层模块着手,实现类似触发器功能的方法。
射天狼 2004-03-19
  • 打赏
  • 举报
回复
楼主提的问题通过简单的方法(不改表的情况下)是解决不了的,只能动大手术了!!
要不然就传所有.这些在设计的时候就应该想到,不应该到中途或者完成的时候才提出来!
yoki 2004-03-19
  • 打赏
  • 举报
回复
在本地access表中加一个修改标志字段用来标志是否更改,其默认值为0,修改过变为1
注意是在本地access表中加
然后回传的时候只选择标志字段为1的数据
这样应该变动不大呀?
realmayer7903 2004-03-19
  • 打赏
  • 举报
回复
在表里加一个字段不是满好的吗?
online 2004-03-18
  • 打赏
  • 举报
回复
就是在数据回传的时候原来的做法是把本地全部数据回传给sever的。现在想改成只回传更改过的数据。

建议还是在表里设定标志,这样会好一些,数据出错的机会少一些
直接使用sql语句
这个在设计的时候你应该想到啊

yassee 2004-03-17
  • 打赏
  • 举报
回复
不要在表里加,在程序里加,temp%,temp=0 未改,temp=1 改过。if temp=1 then ...
vallan 2004-03-17
  • 打赏
  • 举报
回复
那样子我程序里面改动太多了!
而且我是接着做的!

饮水需思源 2004-03-17
  • 打赏
  • 举报
回复
在表中加一个“是否更改”的字段,再根据这个字段判断

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧