请教高手:
参考大富翁之前的解答,尝试解决Access数据库的Compact问题:使用JRO 4.0
引擎,可以正常压缩数据库,压缩后数据库文件格式变为Access2000格式。问题是
有时会出现错误,提示说:
“无法打开工作组信息文件中的表MSysAccounts”, 不明白是什么意思?
用多个Access97数据库文件测试,发现奇怪之处在于:压缩某些文件会反复出现
这个错误,而一旦错误出现,之前处理正常的固定路径文件都不能压缩了。好像失灵
了一样。但如果再挑选其他正常文件进行一次压缩,则固定路径文件又能恢复正常。
由于不知如何跟踪错误代码,只能通过返回的异常文字信息观察。当时这些数据库文
件都没有其他软件访问,系统是Win2000,编译器是Delphi6+Sp2,直接运行编译好的
Exe文件。
总之,执行结果不稳定。这是不是微软的一个BUG?之前用Kaodao控件的数据库压
缩功能,也发现完全相同的现象。用ODBC的控制面板中的“压缩”,也会有此现象。
但使用Access97/2000没有这种毛病。
下面是完整的测试代码:
============================
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComObj, ActiveX;
type
TDBPackForm = class(TForm)
SelFilePack_Btn: TBitBtn;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
ExpViewDBPack_Btn: TBitBtn;
procedure SelFilePack_BtnClick(Sender: TObject);
procedure ExpViewDBPack_BtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DBPackForm: TDBPackForm;
implementation
{$R *.dfm}
//--------------------------------------------------
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩数据库,覆盖原文件
const
SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB
atabase Password=%s;';
var
SPath,SFile:Array [0..254] Of Char;
STempFileName:String;
JE:OleVariant;
begin
GetTempPath(40,SPath);//取得Windows的Temp路径
GetTempFileName(SPath,'~CP',0,SFile);//产生Temp文件名
STempFileName:=SFile;//PChar->String
DeleteFile(STempFileName);//删除旧文件
try
JE:=CreateOleObject('JRO.JetEngine');// 创建OLE引擎对象
OleCheck(JE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord])));//压缩数据库
// 复制并恢复原始文件
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);//删除临时文件
except
on E: Exception do ShowMessage('指定的数据库文件'+AFileName+'压缩失败!'+E.Message);
end;
end;
//--------------------------------------------------
procedure TDBPackForm.SelFilePack_BtnClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
SelFilePack_Btn.Enabled := false;
Screen.Cursor := crSQLWait;
CompactDatabase(OpenDialog1.FileName, '');
Screen.Cursor := crArrow;
SelFilePack_Btn.Enabled := true;
end
end;
//--------------------------------------------------
// 对固定路径的文件进行压缩。执行效果受上面按钮执行结果的影响
// 古怪的地方就在这里了!
procedure TDBPackForm.ExpViewDBPack_BtnClick(Sender: TObject);
begin
begin
DBPack_Btn.Enabled := false;
Screen.Cursor := crSQLWait;
CompactDatabase('C:/Data/Database.mdb', '');
Screen.Cursor := crArrow;
DBPack_Btn.Enabled := true;
end
end;
end.