VB历史上一直悬而未决的问题,今天再次提出,各位高、低手都请进!!!!
很久没提过问题了,但这次实在忍不住了!
“VB+ACCESS的数据丢失问题”
这个问题我在CSDN和其他主要技术论坛都查过,N多人提过,但一直好象没有什么办法?
我总结了以往各位“高手”给出的答案
1、安装上最新的ACCESS2000以及MDAC2.5、2.7、2.8
2、ACCESS不适合局网共享式应用
3、使用了事务的原因
但是问题是我们做的程序在单机、多机连网共享ACCESS数据库上都频繁出现了数据丢失的情况!
我介绍一下具体情况:
1、客户主要使用的都是98、XP
2、开发环境为WIN2K+ACCESS+VB
3、几乎多数客户都发生过单据保存后当时还在,退出程序后或第二天开机就丢失了部份单据!
我们已经在所有客户机器上安装了VB、安装了MDAC2.7、2.8,已经全部安装上ACCESS2000,但为什么情况依旧?
希望大家多多交流,最好能通过本贴让大家找到一个真正的理由!
为了这个问题我们几个项目组成员吃尽了苦头,现在客户一打电话我们心里就害怕,真的没有希望啦!这样下去公司肯定要放弃这个产品的!
希望大家不要再提类似于用SQLSERVER或是重装系统,装MDAC等多余话题,我们只想从一个技术人员的角度上共同分析一下问题的原因以及解决方法?
先谢过大家了!!!!!!!!!!!!!!!!!!!!!!!
问题点数:100、回复次数:65Top
1 楼jilong4(凹凹)回复于 2004-12-03 13:54:11 得分 1
关注Top
2 楼xys(永不放弃)回复于 2004-12-03 13:55:02 得分 0
我现在 可用分:11197
一切为了VB能走的更远,希望大家多出主意,要不真要改开发工具了。Top
3 楼cindytsai(笨笨的蔡鸟)回复于 2004-12-03 13:58:43 得分 1
学习Top
4 楼aohan(aohan)回复于 2004-12-03 14:00:14 得分 1
我们也用网络共享的方式做了一些ACCESS的数据库,但好象没有发现你所说的数据丢失的问题,单机使用更不会出现你所说的问题了,如果真如你所说,好VB+ACCESS是要淘汰了Top
5 楼starsoulxp(星魂)回复于 2004-12-03 14:00:53 得分 1
关注Top
6 楼aohan(aohan)回复于 2004-12-03 14:01:06 得分 1
共享ACCESS的方式肯定不好,所以真的是不推荐!Top
7 楼hlq8210(影子)回复于 2004-12-03 14:07:51 得分 2
像你这种情况要好好查程序的源代码了,
是不是有特殊的数据添加时没有直接保存到数据库里!!!
不是事物的关系!!Top
8 楼daisy8675(莫依 沉迷)回复于 2004-12-03 14:13:38 得分 5
1、安装上最新的ACCESS2000以及MDAC2.5、2.7、2.8
//与你的问题无关,只是关系ado访问而已。
2、ACCESS不适合局网共享式应用
//确实不适合共享的应用,access更适合单机
3、使用了事务的原因
//sql中的事务一样对access有用
我只能猜测到的,数据当时还在,后来不在,只存在以下原因
1,事务
2,access需要进行修复,大量数据在内存中间,用户的数据库被损坏
建议直接发消息给ACCESS的斑竹changechange,他是个access方面的高手Top
9 楼viena(维也纳N02)回复于 2004-12-03 14:16:51 得分 1
没碰到过,是更新没保存上,还是数据库中的数据丢失呢?
我估计是前者吧,否则就太恐怖了,那Access谁还敢用?
能说一下,你是用什么方法访问数据库吗?尤其是如果更新并保存数据的?Top
10 楼xys(永不放弃)回复于 2004-12-03 14:23:41 得分 0
感谢大家的分析,希望能借这个贴让这个问题有所进展。Top
11 楼aohan(aohan)回复于 2004-12-03 14:39:57 得分 1
不能相信的是
************
几乎多数客户都发生过单据保存后当时还在,退出程序后或第二天开机就丢失了部份单据
************
即使修复数据库也不会对数据库的数据有破坏,只有可以是数据确实就没有被保存到数据中Top
12 楼Leftie(左手,为人民币服务)回复于 2004-12-03 14:43:34 得分 2
1,检查程序代码
2,如果对数据库的操作比较频繁或并发操作较多,还是建议将ACCESS数据库换成SQL数据库Top
13 楼love880770(俗人)回复于 2004-12-03 15:00:30 得分 2
不可能出现的,这些问题肯定是程序本身设计的问题。
我看看很多财务软件也是Access数据库,比如金算盘、金蝶。
如果出现你的问题,那原来使用的用户为什么没有?这证明ACCESS没有问题。
金算盘的前台用VB调用操作,为什么没有这种问题,所以是你设计的程序有BUG.
Top
14 楼xys(永不放弃)回复于 2004-12-03 15:03:46 得分 0
对啊,我们在单据保存时,会有非常多的检查与同时对几张表的写入,加了事务处理,但为什么单机版也有这种情况呢?Top
15 楼carpenter01(木匠)回复于 2004-12-03 15:05:27 得分 1
每次 都 独占打开Top
16 楼WallesCai(女人之美,在于蠢得无怨无悔,男人之美,在于撒谎撒得白日见鬼)回复于 2004-12-03 15:05:39 得分 1
我估计是代码有问题,Top
17 楼fishzone(阿愚@脸上有疤)回复于 2004-12-03 15:09:27 得分 15
'我原来的做法是 开始的时候打开 ado connection 一直到退出程序才关上。后来发现有些数据更新不上,特别是在数据操作频繁的情况下。
'现在做法是在操作数据的时候,打开Connection,操作数据,然后Close,然后Set Nothing 。释放内存。当然,RecordSet 也是这样做。
'这样程序会显得慢一些,但是没有了丢数据的情况,也不会出现互锁什么的。
'所以现在所有的数据操作都是“瞬时”的(相对于用户操作来说),不会出现开着一个 Connection 或者 RecordSet 在那儿等待用户输入的情况Top
18 楼xys(永不放弃)回复于 2004-12-03 15:21:17 得分 0
哦,fishzone(阿愚@脸上没疤) :
我们是这样做的,ado connection 一直没关闭,有段共用程序一直处于检查状态,如果connection是NOTHING时,才重新连接,否则一直用它。
而RecordSet 方面我们用完就马上关闭,和这个有关系吗?应该没有吧?
另外,用insert into 应该不会导致这种结果吧?有朋友说应该用rs.addnew 加上 rs.UpdateBatch
但我觉得应该不会产生这样的结果吧?Top
19 楼viena(维也纳N02)回复于 2004-12-03 15:38:37 得分 5
强烈建议connection用完立即关闭,短时间内如果再打开同样的连接,可以从连接池得到,不会有性能损失Top
20 楼xys(永不放弃)回复于 2004-12-03 15:44:31 得分 0
哦,现在已经总结出一条可能了,就是“connection用完立即关闭”
我们马上试试,但还有其他原因的可能吗?
另外,由于我们开发组以前一直在做大产品,所以开发机器至少都在WIN2K PROFESSION下开发、编译,还有FAMILY SERVER的开发机器,这对于在WIN98和WINXP下的用户有影响吗?
希望大家多出点点子,分我多的是,关键是希望为其他开发人员也有个参考贴,免得付出和我们一样高昂的代价!Top
21 楼xys(永不放弃)回复于 2004-12-03 16:01:36 得分 0
另外征求一下意见:
在win98和winxp、win2k都使用的程序,编译环境哪种操作系统最好?
我感觉在win2k下编译的程序只有win2k下使用最稳定,但在98和XP下不同版本效果完全不同!
有的就非常不稳定,甚至安装都有故障。Top
22 楼xys(永不放弃)回复于 2004-12-03 16:08:37 得分 0
另外,VB中用中文版开发及编译与英文版有没有什么不同?
从稳定性及界面上来讲有何区别?
再次感谢大家,今晚就结贴!
不分先后,只看诚意。。。Top
23 楼aiur2000(破愿立志别故里,荆棘南下思北风)回复于 2004-12-03 16:09:20 得分 1
2k最稳定,如果数据多为什么不用sql serverTop
24 楼xys(永不放弃)回复于 2004-12-03 16:16:13 得分 0
正因为数据不多而且考虑到安全、维护和实施方便,才用的ACCESS,你想想,一套单价不高的软件产品,肯定要注意这些细节啊,不可能专门还去装个SQLSERVER吧?
但我怀疑象一些同仁讲的,可能真要在98或XP下编译才更好,因为一些DLL好象版本是不同的。经常出现安装问题。
唉,。。。。这些个环境问题真是把我们害苦了。。。。
希望大家多提些经验性的看法,再次感谢!!!!!!!!!!!!!!!!!!!!Top
25 楼viena(维也纳N02)回复于 2004-12-03 16:36:42 得分 2
建议分版本编译测试,在98上编译98版本,在XP上编译XP版本....;
在空白98上安装并测试98版本,在空白XP上安装并测试XP版本....Top
26 楼xys(永不放弃)回复于 2004-12-03 16:38:22 得分 0
这样短期测试还可以,但总不能销售软件时先问客户的操作系统版本吧?
请问在98、XP和2000中,哪个下面编译最全面支持客户端应用些?Top
27 楼viena(维也纳N02)回复于 2004-12-03 17:24:56 得分 5
//这样短期测试还可以,但总不能销售软件时先问客户的操作系统版本吧?
都带着,安装时,判断操作系统版本,copy不同的文件,这样能保证万无一失啊,免得出了问题麻烦
Top
28 楼caimps(苦乐斋主人)回复于 2004-12-03 18:28:38 得分 2
//都带着,安装时,判断操作系统版本,copy不同的文件,这样能保证万无一失啊,免得出了问题麻烦
这是王道 :-)Top
29 楼xys(永不放弃)回复于 2004-12-03 18:52:52 得分 0
好的,又一条总结也出来了。
即:“安装时尽量多考虑不同操作系统DLL的安装,宁愿安装包大一点,后期维护也就少一分”Top
30 楼laoQ(知秋之叶)回复于 2004-12-04 01:03:37 得分 1
强烈关注中……,
我碰到过类似的,
不过是MS SQL Server的,
郁闷了半天,,,
未果……,
帮楼主UPTop
31 楼xys(永不放弃)回复于 2004-12-04 11:07:36 得分 0
再 顶 一 次 !Top
32 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2004-12-04 15:26:37 得分 1
来晚了,想要说的都别说出来了,不过对下面这句话不太明白:
正因为数据不多而且考虑到安全、维护和实施方便,才用的ACCESS,你想想,一套单价不高的软件产品,肯定要注意这些细节啊,不可能专门还去装个SQLSERVER吧?
ACCESS安全吗?装一个ACCESS 和一个SQLSERVER有什么区别呢?难道你们都用正版吗?
Top
33 楼hanyaocsdn()回复于 2004-12-04 16:08:09 得分 1
upTop
34 楼aohan(aohan)回复于 2004-12-04 16:27:30 得分 1
////ACCESS安全吗?
不大安全
////装一个ACCESS 和一个SQLSERVER有什么区别呢?
性能有很大的区别
////难道你们都用正版吗?
自己用D版玩,别人公司用的就有很多正版,要记住数据库是客户要出钱的,不是你送的。
Top
35 楼Shidachuang(小小鸟)回复于 2004-12-04 18:29:49 得分 2
我的老师上课时和我们提过这件事,他说他当年用VB给人做工程时也有这样情况,结果那家单位损失了好几万,没撤!!Top
36 楼dream2013(每个人都有魔鬼的一面( http://blog.sina.com.cn/u/1422260677 ))回复于 2004-12-04 19:51:31 得分 1
赫赫,学习Top
37 楼IloveAzhu(AJUN)回复于 2004-12-04 19:52:47 得分 2
ACCESS原则上还算不得数据库,它只是基于文件的管理,原则上应该微软也考虑过多用户的并发操作问题,但如果真是出现你说的这种情况,可以设置单入口,采用锁机制,可能会好一些,只有牺牲一下客户的操作时间了。但建议你还是仔细查阅一下你的程序吧。Top
38 楼VBCricket(蟀蟀)回复于 2004-12-04 20:00:22 得分 1
应该不会吧。我看到一些论坛的源码。ASP+ACCESS。那可是网络论坛。都没有这样的问题呢。Top
39 楼hylaeion(☆霖湘凝☆)回复于 2004-12-04 22:23:51 得分 1
我觉得可能是代码中什么地方有问题,
另外也可能是数据太多的原因~Top
40 楼newsuperstar(与日月齐辉)回复于 2004-12-04 22:51:38 得分 1
没碰到过类似问题,建议多从程序代码上查问题。Top
41 楼daliboy()回复于 2004-12-05 00:16:10 得分 1
我觉得楼主可以开发出各种版本,让客户来选嘛Top
42 楼adorph()回复于 2004-12-05 02:10:27 得分 0
Sorry,因找不到"小类社区"发新帖,只好接在您后面啦^_^
--------------------------------------------------
本人因学习需要:
1. "Visual Basic 6.0 中文版程序员指南"
Microsoft Corporation 著
微软(中国)有限公司 译
北京希望电脑公司 出品
(含一张配套光盘)
2. "Microsoft Visual C++ 6.0 程序员指南"
Beck Zaratian 著
微软授权出版
(含一张配套光盘)
3. (中文版, 英文版皆可) (含一张配套光盘)
中文名: Programming Windows程式开发设计指南(第五版)
作者: Charles Petzold
英文名: Programming Windows by Charles Petzold (Fifth Edition)
Microsoft Press
交易地点: 限南京市
本人: 孙先生
本人联系方式:
Email: jerysun0818@hotmailcom
或 jerysun0818@yahoo.com.cn
手机: 13003424733 (请发短信, 本人囊中羞涩, 从不接手机:-)
您的回复信息格式为:
1. 您的姓名, 联系方式(手机, Email)
2. 以上您有哪几本还是全有? 您出的交易价格?
3. 在何时, 何地交易?Top
43 楼xys(永不放弃)回复于 2004-12-05 10:53:20 得分 0
关键就在于程序量太大,又要考虑到安装方便,所以一直没换数据库Top
44 楼hdhai9451(☆新人类☆)回复于 2004-12-05 11:06:07 得分 1
//“VB+ACCESS的数据丢失问题”
因access不是大型數據庫,如果你的數據量大到一定程度,數據丟失的可能性很大,這就是小型數據的弱點了
Top
45 楼godanddog(苦行者)回复于 2004-12-05 11:41:07 得分 5
access根本就是针对单用户的数据库,你别听微软瞎吹,严格来讲它就不是什么数据库,只是一个数据文件,它没有完善的安全机制,你可以做两个试验:
1、多程序同时写数据库,有可能数据丢失(同机器的数目没有关系);
2、程序写数据库时,你非正常杀死程序或干脆强制关机,数据库损坏。
所以使用ACCESS做多用户的数据库是软件设计的大忌,它同VB、MDAC一点关系都拉不上,而是你在强按牛头吃草,冤枉VB了。
这个问题也不是历史上一直悬而未决的问题,老程序员因为以前的计算机性能低下,往往要在ACCESS和SQLSERVER之前做抉择,所以这个问题算是常识,只是现在的程序员因为机器性能高,动辄就SQLSERVER,所以反而不知道,还把它当成历史悬案了。
至于论坛,那是IIS机制的功劳,没ACCESS什么事。
Top
46 楼xys(永不放弃)回复于 2004-12-05 14:44:08 得分 0
还有没有新的意见?马上要结贴了!Top
47 楼xys(永不放弃)回复于 2004-12-05 15:05:04 得分 0
晚上七点回来结贴,希望有更新的意见 !Top
48 楼starhsnow(星*雪)回复于 2004-12-05 15:12:47 得分 1
这个跟选择哪种数据库没什么关系.老兄是用什么语言开发的?Top
49 楼xys(永不放弃)回复于 2004-12-05 15:14:39 得分 0
不是选择数据库的问题,我只是想找到可能产生的原因,前面我写的你没仔细看吗?
//############################
1、客户主要使用的都是98、XP
2、开发环境为WIN2K+ACCESS+VB
3、几乎多数客户都发生过单据保存后当时还在,退出程序后或第二天开机就丢失了部份单据!
############################//
Top
50 楼killStar(超星)回复于 2004-12-05 15:32:20 得分 5
开发多年也没遇到过这种问题,和开发工具有什么关系呢?照老兄说的,顶多是和数据库、ADO(如果你用该对象访问)有关系,而且这种情况发生的可能性即便存在,又会有多大几率呢?而你们的客户多数都出现情况了,你是否能保证程序的逻辑控制就没有问题呢?编程序最忌讳的就是以自己作为正确的立场来否定别的事务。Top
51 楼bjwanghui(vbfan)回复于 2004-12-05 16:03:56 得分 1
楼上的:
==================
来晚了,想要说的都别说出来了,不过对下面这句话不太明白:
正因为数据不多而且考虑到安全、维护和实施方便,才用的ACCESS,你想想,一套单价不高的软件产品,肯定要注意这些细节啊,不可能专门还去装个SQLSERVER吧?
ACCESS安全吗?装一个ACCESS 和一个SQLSERVER有什么区别呢?难道你们都用正版吗?
===================
使用access就非要装access吗?我们只是使用Microsoft.Jet.OLEDB.4.0 ,或者 microsoft access driver,如果你愿意,你的access文件可以取名XXXX都可以,可是如果使用SQLserver ,那好了,客户那里至少得有一个SQL server在那里运行,除非你提供一个sql服务器,把客户的数据放在你这里.这个关盗版和正版什么事呢?
Top
52 楼godanddog(苦行者)回复于 2004-12-05 17:12:36 得分 2
不是选择数据库的问题,我只是想找到可能产生的原因,前面我写的你没仔细看吗?
----------------------------------------------------------------------------
如果说你的重点是为了问题的解决方案,那你提供的信息量太少了,我们也无从下手,怪不得别人。
就光是你提的那几点,什么可能性都有,但最大的可能性是你们程序设计问题。
access数据文件可以达到2个G,那时候速度很慢,再大就有可能打不开文件,但没发现过存盘失败的情况。但作为一根救命稻草,你可以问一下数据文件大小,并且添加压缩数据文件大小的语句。
如果你实在不愿意考虑是否是自己的程序算法问题,则不防把运行环境、数据文件、丢失内容归纳一下,列成表格,对比一下异同点,也许能解决问题。
Top
53 楼Tiger_Zhao(VB老鸟)回复于 2004-12-05 17:30:39 得分 2
1. 同意 godanddog(苦行者) ,Access 数据库太大会有异常,如果数据库文件大小达到 G 的单位,应该分不同的数据库文件存放数据。
2. 仔细检查程序,特别是事务操作。Top
54 楼jekexys2004(浪傲)回复于 2004-12-06 09:36:21 得分 2
你的數據太多,也許這就是Access 本身的缺陷;
但我想最大的原因還是數據根本沒保存到數據庫裏面,你仔細看看Updata的代碼,我以前也遇到過類似的問題,而且我的數據不多也會這樣。Top
55 楼vansoft(Vansoft Workroom)回复于 2004-12-06 10:44:01 得分 1
为什么要用ACCESS共享?
难道VB的三层分布式开发就是你们所谓的将ACCESS文件共享,
然后每个客户端直接访问?
I服了UTop
56 楼xiaoxiaoP(每天都是重新开始)回复于 2004-12-06 15:27:06 得分 1
up>>
uP>>
我也曾遇到差不多同样问题,单机当记录数特别多时或是多机同时频繁操作时,有ACCESS坏掉的现象,不过好像没遇到过丢数据的事。我现在网络数据库全用SQL SERVER,一直没问题,也不算复杂的。
Top
57 楼icedut(冰-装修进行中)回复于 2004-12-06 15:45:57 得分 1
我们单位也发生过类似的情况(当数据量较大的时候)
后来也是没办法,把我们地区物流中心的数据库修改为sql server
Top
58 楼icecanal()回复于 2004-12-06 15:46:14 得分 1
同意 vansoft(Vansoft Workroom)
问题出在共享式访问上
这是完全是单机版程序应用在网络平台
别说是三层了,C/S都算不上Top
59 楼lovebeethoven(小佛-寻找幸福)回复于 2004-12-06 15:53:39 得分 5
从书上看到一个查询出RECORDSET的函数,可以放到标准模块中,我觉得挺好用的,你可以参考下
Public Function EXESQL(ByVal txtsql As String) As Recordset
On Error GoTo errsqlh
Dim cnn As ADODB.Connection
Dim db As ADODB.Recordset
Dim ss() As String '定义数组为比较第一个SQL语句中的关键字
ss() = Split(txtsql)
Set cnn = New ADODB.Connection
cnn.ConnectionString = "。。。。。"
cnn.Open
If InStr("INSERT,DELETE,UPDATE", UCase$(ss(0))) Then
cnn.Execute txtsql
Else
Set db = New ADODB.Recordset
db.CursorLocation = adUseClient
db.Open Trim$(txtsql), cnn, adOpenDynamic, adLockOptimistic
Set EXESQL = db
End If
Set db = Nothing
Set cnn = Nothing
Exit Function
errsqlh:
MsgBox Err.Description
End FunctionTop
60 楼bboos(梧桐:只灌水不谈技术)回复于 2004-12-06 16:24:17 得分 2
一般来说,代码问题居多。比如 事务处理上,处理失败没有及时的回滚,1事务开的过长,2错用on error resume next等都有可能导致 数据的不正常回滚。数据库设计不完美,access不比salserver,更多的是靠客户端代码操作,涉及多表,或多库操作,都有可能因网络中断或延持 而导致数据操作的失败,建议改善数据库设计,优化查询语句。
//其实数据库这东西,是为程序员服务,而不是客户;操作功能低点的数据库,更要程序员下工夫花心思去面对。
//小李飞刀用的是飞刀而不是手枪;access好比飞刀,sql server好比手枪。
Top
61 楼featherfly(羽毛飞呀飞)回复于 2004-12-06 16:24:29 得分 1
请问楼主是用 insert into 还是 rs.addnew 添加数据
我只用 insert into 添加数据,没有遇到你说的问题Top
62 楼bboos(梧桐:只灌水不谈技术)回复于 2004-12-06 17:11:09 得分 2
从维护角度的观点:
//在所有客户机器上安装了VB、安装了MDAC2.7、2.8,已经全部安装上ACCESS2000
-- 这是程序员的大忌。
//在不同系统下作不同版本的说法
-- 极力反对,作不同版本,是迫不得以的做法。事实证明微软的系统有很好的向下兼容机制。一个程序分作好多个版本,让人有种菜菜的感觉,客户也不看好。
//access的维护
-- 这个小东西经常会坏掉,而且体积越来越大。作法: 数据导出,然后删除,重新建立,再导入数据。
其实access数据库的程序很好维护,在网上挂个升级包,时不时的对客户的程序 copy 一下就行了。
Top
63 楼43720938(烦烦烦烦)回复于 2004-12-06 17:13:46 得分 1
关注Top
64 楼apple_001(天堂里的狼)回复于 2004-12-06 20:46:02 得分 3
不过微软的东西向下兼容我看也不见得好,前不久写了一个小东西,用到了微软的精灵组件,在2000下面写的,在2000和xp下面运行没有问题,一到98下就出错,后来才发现在98下也有跟2000和xp一样的精灵组件,只不过文件不一样罢了,弄明白了这个道理,总算才搞定了这个事件。access用了很多,基本上没有发现楼主说的情况,我也认为应该是代码上面有问题,不过话说到vb,有时候vb自己也有一些莫名其妙的问题,我的一个程序,在不需要改动一个字的情况下,有时候能正常运行,有时候报错,最后没有办法加了一个错误跳过才可以用了的,都不是数据库造成的,就是一句简单的text1.setfouce,也不知道写对了没有,我都是用vb自动完成的,就是获取焦点的那句,也顺便听听大家的意见Top
65 楼xys(永不放弃)回复于 2004-12-07 00:39:19 得分 0
多谢各位兄弟的指教!我们已经按照以上总结的内容进行程序修改了,希望对后来者有所帮助!
再次感谢 !!!!!!!!!!!!!!!!!!!!
结贴!!!!!!!!!!!!!!!!Top




