请教高手,Access2000数据库锁定的问题?(100分)

  • 主题发起人 主题发起人 Tiger_Dxj
  • 开始时间 开始时间
T

Tiger_Dxj

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟前一阵帮别人做了一个程序,用ADO访问Access2000数据库,并以网上邻居文件共
享的形式在几台机器上同时使用这个Access库,一个多月都没事,这两天据他们使用的人
讲出现了两次数据库“锁定”(他们这样讲的,我没看到)的现象,好在他们每天都备份,
使用备份的数据就可以,不过当天的数据就要从录,因为他们在外地用,我没法去看,我把
锁定的数据库拿到我的机器上用,程序无法打开,用office2000打开说未知的错误,问要否
修复,答是则可以修复,修复后的文件就可以正常使用。库内共6个表,一共大约2000条记录。
请问这是为什么??
 
ACCESS单机数据库还行,多机共享使用长了肯定会有问题。
建议使用INTERBASE(不要钱),或者桌面版sql server
 
没见过,不过如果真的是这个问题,我想应该说算是Access的Bug,使用Access2000都打不开,
还能算我们程序的错误吗?我们程序也许可以进行事务保护等,但是绝对作不到使他的数据库文件
出现Bug呀!
所以,我估计这应该算是桌面版数据库Access的本身Bug,也许程序可以更改一些。
比如,多余多表提交,尽量使用相同顺序,对于修改数据,一定要在事务里面等等。
 
所定是由于某人以独占方式打开了数据库,例如创建表、修改表结构等,一般只读取数据的情况下应该不会发生!
 
燃眉之急,是给他提供一个修复数据库的工具,如果出错了,可以直接修复,代码如下,有些乱。

function TFrm_Export_Show.Compact_DB(l_Dest_DBName: String; l_Password: String): Boolean;
var
Dest_DB_Connection: OleVariant;
l_Source_Con_Str, l_Dest_Con_Str: String;
begin

DM_Pub.Acon_Export.Close;

if FileExists(l_Dest_DBName) = True then
if DeleteFile(pChar(l_Dest_DBName)) = False then
begin
Application.MessageBox(pchar('覆盖文件' + l_Dest_DBName + '出错!可能文件正在被使用!'), '提示', 48 + mb_ok);
Result := False;
Exit;
end;

try
Dest_DB_Connection := CreateOleObject('JRO.JetEngine');
except
if Application.MessageBox('创建JRO.JetEngine失败!可能是当前所安装的ADO版本不同!压缩数据库失败!是否将没有压缩的文件导出?', '询问', 32 + mb_ok) = MrYes then
begin
Result := Export_DB_File(l_Dest_DBName);
Exit;
end
else
begin
Result := False;
Exit;
end;
end;

l_Source_Con_Str :=
'Data Source=' + VG_APP_PATH + 'JWC_Export.MDB' + ';' +
'Jet OLEDB:Database Password="' + VG_DB_PASS + '"';

l_Dest_Con_Str :=
'Data Source=' + l_Dest_DBName + ';' +
'Jet OLEDB:Database Password="' + l_Password + '"';

try
OleCheck(Dest_DB_Connection.CompactDatabase(l_Source_Con_Str, l_Dest_Con_Str));
Result := True;
except
if Application.MessageBox('压缩导出文件失败!是否将未压缩的文件导出?', '询问', 32 + mb_YesNo) = mrYes then
Result := Export_DB_File(l_Dest_DBName)
else
Result := False;
end;
end;
 
接受答案了.
 
后退
顶部