回 帖 发 新 帖 刷新版面

主题:VFP数据丢失问题

前几天我写了个程序,运行都好,就是程序运行过程中如果突然断电,数据表中的数据会丢失,即使程序停留在主界面也是这样,后来我把程序修改了一下,程序返回主界面时我把所有表都关闭了,结果人为断电时数据还是照样丢失,各位师傅,有没有办法可以避免这一问题发生呢。

回复列表 (共28个回复)

沙发

加一段自动备份的代码,在退出系统时,自动备份数据,自动按当前小时行成文件名,存放于“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

当然,可以举一反三,自行调整

板凳


谢谢你,不过我的情况是突然断电,系统丢失资料,假如我在系统备份前做了很多事,录入了很多数据,这时停电,那我的数据又会丢失。
附   我录入数据后把数据表关闭,这时停电(即不正常关闭程序,  也会丢失数据。感到很奇怪,表已经关了,还掉数据。我看别的数据库就不会这样.
可不可以在录入了数据后,写一段什么代码让它存储数据,然后关表。

3 楼

那建议你录入大量数据时,每录入一部份就退出一下,还有,干嘛异常断电?买个UPS

4 楼

请楼主将你的程序实例片段传上来,[包括丢失前(关电前)和(关电后)已丢失后的数据(库)表],发到我邮箱也行...我来帮你解决!

5 楼

楼主的问题我也遇到过。经过试验发现:程序在运行中,使用常规命名进行的数据保存其实并不是真正意思上的保存,即数据没有被保存到外部存储器(如硬盘)中,而是保存在内存中中。如果程序正常退出,那么数据将写入外存储器。而当程序异常退出的时候,内存中的数据将丢失。你可以用windows的强制退出来测试一下。

鉴于这种状况,vfp提供了一个命令:

flush 命令
将对表和索引所作的修改存入磁盘。

你可以在你保存数据的代码最后加入 fulsh ,这样异常退出数据就不会丢失了。

6 楼

vfp中用 USE、CLOSE ALL、或 CLOSE DATABASES 命令关闭表。只有被关闭文件的相关信息存入磁盘。 
对记录或文件解锁。只有被解锁的记录或文件的信息才存入磁盘。 

7 楼

那是你的程序问题:已经保存的,断电时不会丢失的,除非你的保存是假保存

8 楼

断电问题基本没有完美的解决方案,UPS才是王道

9 楼

例如我用如下代码
use abc
aPPEND FROM AAA.DBF
USE
然后人为断电,这时表ABC中的数据并没有添加成功。好象要等3分钟左右才会添加。

10 楼

1、首先要有“完整性数据较验”的习惯。你碰到的只是不管有意无意断电的小问题,而我碰到的是远程数据传输时(主要是钱款数据必须是100%正确)断网和丢包的麻烦大问题。
2、根据楼主的示范代码,我的解决方案如下:

A:预处理(取库文件头记录参数)
  
  1 取 abc 库记录参数 并存入参数库或变量文件
  2 取 aaa 库记录参数 并存入参数库或变量文件 

B:执行   

  3 use abc
  4 aPPEND FROM AAA.DBF
  5 USE

。。。。。如重启检测出现意外就进入完整性数据较验。。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册