非常急的一个数据库小问题(更新数据库)(200分)

  • 主题发起人 主题发起人 LSS
  • 开始时间 开始时间
L

LSS

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI4下使用PARADOX表如何在只执行table1.POST,而没
有table1.CLOSE情况下计算机重新启动,使表中数据保存下来,
如果需要用BDE API,如何使用。最好在不改动原程序的情况下,
能否通过设置BDE参数来达到要求
 
table1.post就是把数据保存!不用Table1.close!
 
我想说在不用CLOSE的情况下,计算机断电,则刚POST的数据会丢失
 
老兄的问题有点儿狠,我粗暴关了三次机器,没有你说的情况啊?
 
多谢老兄成全,可能我没说清楚,问题是这样,新建一个
APPLICATION,在FORM上加入TABLE控件,新建一个数据库,
字段为A,类别为整型;建立一个新别名,路径指向存放数
据库的目录,default driver 为PARADOX,类型为STANDARD;
在FORM上的TABLE控件别名指定为新别名,TABLENAME为新
数据库名,ACTIVE属性置为TRUE,在FORM上放置按钮,CLICK
事件为TABLE1.appendrecord([1]);
在启动程序后按下按钮后,如果放置DBGIRD会看到增加一
条记录,这时按计算机RESET按钮,重新启动计算机,再执
行该程序,刚增加的记录已经不存在了,请再试试看。我又
“粗暴”的试了一次,这好像是真的
 
我完全按照你的步骤做了几遍,没有什么问题;
除非你忘记了一件主要的事情,你把cachedupdates
设成true了,我猜的对吗?如果对的话,就很正常了,
你只是POST到CACHE中了,并没有真正到你的数据库.
 
table1.ApplyUpdate;
 
table1.ApplyUpdate;
 
有这样的情况,可以到深度历险找个控件,有SOURCE
或者用第三放提供的TABLE
 
cachedupdates已经置为FALSE,我想我知道cachedupdates的用途,另外
table1.ApplyUpdate只对cachedupdates为TRUE时有效,十分抱歉,我不
知道nickname老兄如何试的???
另外我看CJ好象明白我的意思,能否详细讨论一下?
 
很奇怪
为什么要在增加一条记录之后按reset?
或者说为什么你的程序要考虑到增加一条记录之后要考虑断电问题? 在table.open
时为什么不怕断电? 即使这条记录是增加到硬盘上了又如何? 既然断电了, 你的程
序当然也不可能执行断电之后的语句, 这样的话增加了和不增加有什么区别? 下次
进入之后重新进行一次操作不就可以了?
如果怕用户相同记录输入两次, 你该在程序中进行判断才对, 不能寄托在用户是否
看到屏幕上已存在该记录就不再输入的基础上。
另: 即使操作系统都无法知道突然断电时数据是否写入硬盘中。 何况我们编制的应
用程序。
考虑这种问题是否属于想得太多了吧?
不管什么情况, 突然的断电造成的后果都是不可预计的。 程序可没法控制。
有点杞人忧天了吧?
该考虑的不是程序解决这个问题, 而是提醒您的用户非正常关机或突然掉电情况下整
个数据库都有可能损坏, 更不用说刚才输入的东西是否保存了。
 
table1.Open;
if not table1.Database.InTransaction then
table1.database.StartTransaction;
...
table1.post
...在Afterpost事件中写上:
table1.database.Commit;
table1.database.StartTransaction;
 
bde api 的help中不是有例子吗?
在table.afterpost中加一个bde api 的物理存盘操作。
 
按LSS的做法Reset没出现上述问题.
同意 nickname 的说法, 你所需要的就是随时输入随时存盘, post 就是存盘了. 至于为什么丢东西, 应该找一下是否还有别的因素影响没有真正存盘.
同意 Another-eYes 的说法, 掉电了就是Get lost. 如果工作重要, 加一个500元钱
的UPS吧.
 
各位老兄,由于工作忙,白天没有来看,想不到有这么多的朋友帮助
我解决问题,特此感谢。Another_eYes和huizhang大侠的问题我想解
释一下,由于本人编制的软件在实际用的过程中,由于系统出现故障
或断电,有可能一天的数据都丢失(因为在系统运行过程中始终没有
退出,所以所有的库都没有关闭过,数据库在没有关闭时,如没有特
殊操作数据始终会在缓冲区中)我和一位朋友终于找到问题的答案,
在table1的afterpost或table1的afterdelete事件中加入
table1.FlushBuffers;可全缓冲区中数据写入磁盘,在使用这条语句
后约有秒可明显看到硬盘有动作。另外xixi的程序我试过了,好像对
PARADOX表不太适用。
另外,本人是首次提问,对于这种自己找到答案的情况该如何解决,
请版主示下或请各位大侠明示!
 
实验方法:
1.输入数据且POST
2.RESET或者搞个致命错误(我就是因为这个才关心起这个问题的)
3.启动程序
4.数据丢失
我以前为客户解决过这个问题,现在忘记怎么赶的了:))好象不是用那个控件,
而是BDE API我去找找以前的程序再告诉你,我的程序写了就丢,很难找的.
 
Table.Post并为真正完成数据的物理存储。
BDE的API中有强制数据写入的函数dbiSaveChange
syntax:
function DbiSaveChanges (hCursor: hDBICur): DBIResult stdcall;
Description:
DbiSaveChanges forces all updated records associated with hCursor
to disk.
Parameters:
hCursor Type: hDBICur (Input)
Specifies the cursor handle.
Usage:
If the table associated with hCursor is a temporary table (created
with DbiCreateTempTable), DbiSaveChanges saves all buffered changes
to disk and makes the table permanent. This table will not be removed
when the cursor is closed.
SQL:
This function is not supported with SQL tables.
DbiResult return values:
DBIERR_NONE All changes have been saved successfully.
DBIERR_INVALIDHNDL The specified cursor is invalid or NULL.
DBIERR_NODISKSPACE The changes could not be saved because there is
no disk space available.
DBIERR_NOTSUPPORTED This function is not supported for SQL tables.
Examples:
use BDE
.
.
.
Table.Post;
DbiSaveChange(Table1.Handle);
 
他这问题无法解决!
如果DbiSaveChange(Table1.Handle)执行一半时断电怎么办?
用Ups吧!
 
实际上在我的程序里DbiSaveChange()是在表的AfterPost里执行的,每当Post后就
执行一次,我的习惯是每修改一次数据必然Post,这样在执行时突然断电,无非只
丢失最后修改的数据而已,恢复起来还是比较容易的,如果数据的完整性是数据库
的重要衡量标准而用户又频繁断电的话,买台UPS非常有必要。
 
同意天才的说法,好象就是它
TO DELPHI FAN 2:那样说未免偏激,而且就酸在执行过程中缎电,那么程序
也只丢失最后的修改,
我觉得系统鼓掌比簖电的机会多的多,所以UPS虽然必要,但不解决问题,
 
后退
顶部