非常简单的问题,但我可以把我的分都给你(关于数据库的一些常识问题)(100分)

  • 主题发起人 主题发起人 yuzhantao
  • 开始时间 开始时间
Y

yuzhantao

Unregistered / Unconfirmed
GUEST, unregistred user!
1 我在做一个数据表软件的时候,一运行就出现下面的一个提示。谁能告诉我到底是怎么
事么?
Project Project1.exe raised exception class EDBEngineError with
message 'File is locked
Table: E :/听涛/记录表/上机记录表.DB

ok help
上面的路径是我放一个表的路径。我翻译过来看说是文件是锁定的,我真是蒙了
谁知道告诉我到底是怎么回事好么?最好留下oicq,万一情况不是,我也好能问问。谢谢
您看完这篇文章。
 
你是否用其它程序打开了这张表?比如用表工具打开了表,但在Delphi程序又打开它?
 
是不是有记录被锁定???
用这个函数试试!
function IsLocked(ATable: TTable): boolean;
var
RecordProps: RECProps;
wResult: DBIResult;
begin
Result := True;
with ATable do
begin
if State = dsInactive then DBError(SDataSetClosed);
UpdateCursorPos;
wResult := DbiGetRecord(Handle, dbiWriteLock, nil, @RecordProps);
if wResult = DBIERR_NONE then
begin
DbiRelRecordLock(Handle, False);
Result := False;
end;
end;
end;

 
原因就是有两个程序想同时访问数据库引起的,你再好好看看吧。
 
EDBEngineError这种错误难免会遇到,最好的方法是捕获这种错误!
 
如果你不在乎数据的实时更新的话,你的对数据库的操作都不应当有加锁操作。通常打开记录
都采用最优锁,可以使锁定表的时间最短,你可以使用了悲观锁,一旦有一个程序对表操作
则表完全锁住,则其它程序就不可能写了。你检查一下你所有操作数据的地方的锁类型。
 
给你一个捕获EDBEngineError的函数,把它添加到Try。。。后面就可以避免出错的尴尬了!
Function ErrorDB(E: Exception; R: Boolean): Boolean;
var
iDBIError: Integer;
iBot : Integer;
Msg : String;
i : Integer;
begin
Result := False;
iBot := 0;
if E is EDatabaseError then
if E is EDBEngineError then
begin
iDBIError := (E as EDBEngineError).Errors[0].Errorcode;
if R and not ((iDBIError = eViolClave) or (iDBIError = eRegEliminado) or
(iDBIError = eTablaNoExiste) or (iDBIError = eNoZapTablaDet)) then
iBot := 42;
Msg := LoadStr(iDBIError);
if Msg = '' then
begin
iBot := 0;
Msg := IntToStr(iDBIError)+ '//' +(E as EDBEngineError).Errors[0].Message;
end;
Result := Mensa(Msg, '', 5, iBot) = mrRetry;
end
else
Mensa((E as EDatabaseError).Message, '', 5)
else
Mensa((E as Exception).Message, '', 5);
end;
 
如果你不是很熟悉锁的话,一个比较简单的做法就是在需要数据的地方才打开数据库的
连接,其他地方就把连接关掉。
 
我通过 QQ 联系,不是这个问题,而是他望了在编辑的时候加
Edit;
inst....
Post;
的问题。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部