主题:VFP数据丢失问题
liyingjun8
[专家分:140] 发布于 2009-10-15 08:26:00
前几天我写了个程序,运行都好,就是程序运行过程中如果突然断电,数据表中的数据会丢失,即使程序停留在主界面也是这样,后来我把程序修改了一下,程序返回主界面时我把所有表都关闭了,结果人为断电时数据还是照样丢失,各位师傅,有没有办法可以避免这一问题发生呢。
回复列表 (共28个回复)
沙发
dfwxj [专家分:270] 发布于 2009-10-16 01:22:00
加一段自动备份的代码,在退出系统时,自动备份数据,自动按当前小时行成文件名,存放于“BAK”文件夹下,同一小时内自动覆盖,隔小时保留,只保留最近一个月的备份
zfile='bak\00000000'+left(ttoc(datetime(),1),10)+'.cab'
WAIT '正在备份数据,请稍候...' wind nowa
=zip('data\*.*',zfile,'32090000000000')&&加密压缩,需木瓜大侠的myfll.fll支持
WAIT '正在清理数据,请稍候...' wind nowa
n1=adir(aa,'bak\*.cab')
FOR i=1 to n1
fname=aa(i,1)
IF aa(i,3)<gomonth(date(),-1)
Dele file bak\&fname
ENDI
ENDF
WAIT clea
当然,可以举一反三,自行调整
板凳
liyingjun8 [专家分:140] 发布于 2009-10-16 06:51:00
谢谢你,不过我的情况是突然断电,系统丢失资料,假如我在系统备份前做了很多事,录入了很多数据,这时停电,那我的数据又会丢失。
附 我录入数据后把数据表关闭,这时停电(即不正常关闭程序, 也会丢失数据。感到很奇怪,表已经关了,还掉数据。我看别的数据库就不会这样.
可不可以在录入了数据后,写一段什么代码让它存储数据,然后关表。
3 楼
dfwxj [专家分:270] 发布于 2009-10-16 19:56:00
那建议你录入大量数据时,每录入一部份就退出一下,还有,干嘛异常断电?买个UPS
4 楼
foxdb [专家分:1830] 发布于 2009-10-16 22:35:00
请楼主将你的程序实例片段传上来,[包括丢失前(关电前)和(关电后)已丢失后的数据(库)表],发到我邮箱也行...我来帮你解决!
5 楼
Gleam [专家分:3100] 发布于 2009-10-17 17:03:00
楼主的问题我也遇到过。经过试验发现:程序在运行中,使用常规命名进行的数据保存其实并不是真正意思上的保存,即数据没有被保存到外部存储器(如硬盘)中,而是保存在内存中中。如果程序正常退出,那么数据将写入外存储器。而当程序异常退出的时候,内存中的数据将丢失。你可以用windows的强制退出来测试一下。
鉴于这种状况,vfp提供了一个命令:
flush 命令
将对表和索引所作的修改存入磁盘。
你可以在你保存数据的代码最后加入 fulsh ,这样异常退出数据就不会丢失了。
6 楼
笨兔 [专家分:300] 发布于 2009-10-17 18:09:00
vfp中用 USE、CLOSE ALL、或 CLOSE DATABASES 命令关闭表。只有被关闭文件的相关信息存入磁盘。
对记录或文件解锁。只有被解锁的记录或文件的信息才存入磁盘。
7 楼
lbscyb [专家分:4780] 发布于 2009-10-19 00:41:00
那是你的程序问题:已经保存的,断电时不会丢失的,除非你的保存是假保存
8 楼
liupeisong [专家分:2340] 发布于 2009-10-19 23:24:00
断电问题基本没有完美的解决方案,UPS才是王道
9 楼
liyingjun8 [专家分:140] 发布于 2009-10-20 15:40:00
例如我用如下代码
use abc
aPPEND FROM AAA.DBF
USE
然后人为断电,这时表ABC中的数据并没有添加成功。好象要等3分钟左右才会添加。
10 楼
foxdb [专家分:1830] 发布于 2009-10-20 17:20:00
1、首先要有“完整性数据较验”的习惯。你碰到的只是不管有意无意断电的小问题,而我碰到的是远程数据传输时(主要是钱款数据必须是100%正确)断网和丢包的麻烦大问题。
2、根据楼主的示范代码,我的解决方案如下:
A:预处理(取库文件头记录参数)
1 取 abc 库记录参数 并存入参数库或变量文件
2 取 aaa 库记录参数 并存入参数库或变量文件
B:执行
3 use abc
4 aPPEND FROM AAA.DBF
5 USE
。。。。。如重启检测出现意外就进入完整性数据较验。。。。。
我来回复