求较:如何用ADO进行Access数据库的多库访问和CompactDatabase(100分)

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

lujun

Unregistered / Unconfirmed
GUEST, unregistred user!
1、多个MDB数据库文件中的表可以象一个数据库文件一样,使用SQL方便的操作吗?
2、怎么解决Access数据库的Compact问题呢?
 
1,可以,但不大方便

2.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1268352
 
1.可以,改变connectionstring的参数就可以了,很容易的。
2.同上。
 
2.能解决问题,


function CompressMDB(ASourceMDB: string; Mode: Byte)
1:压缩;2:修复

function CompressMDB(ASourceMDB: string; Mode: Byte): Boolean;
var
sNewDBName :string;
AdoEngine: _DBEngine;
begin
Result := False;
AdoEngine := (CoDBEngine.Create) as _DBEngine;
try
try
if Length(ASourceMDB) = 0 then Exit;
case Mode of
1: begin
sNewDBName := FormatDateTime('yyyymmddhhnnss',Now);
AdoEngine.CompactDatabase(ASourceMDB,sNewDBName,'',0,'');
DeleteFile(Pchar(ASourceMDB));
RenameFile(sNewDBName+'.mdb',ASourceMDB);
end;
2: AdoEngine.RepairDatabase(ASourceMDB);
end;
Result := True;
except
end;
except
end;

end;
 
求教iapollo!如何通过改变connectionstring的参数进行多库文件访问?
 
改connectionstring不能进行多数据库文件访问,只能通过SQL语句,例
INSERT INTO 目标表 (字段名1,字段名2...) IN "C:/A.MDB" SELECT 字段名1,字段名2 FROM 源表;
其中的源表是当前打开连接的数据库,目标表文件"C:/A.MDB"不能有密码
 
请教高手:
参考大富翁之前的解答,尝试解决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:Database 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.
 
对数据库访问出现“无法打开工作组信息文件中的表MSysAccounts”问题,找到的
解决方式是:
该动ConnectionString,把Ole Provider 从 Ms Jet4.0 改为Ole Provider For ODBC。
程序就一切正常,访问性能基本和Jet 4.0的差不多。这可以说是绕过了这个问题。
具体为何会出现这个问题,还要请教大家。
 
分解一下第一个问题。多数据库访问主要用于需要产生大量数据的应用,技术
上涉及到下列问题:
1、如何用程序动态建立Access数据库文件;
2、在建立好的数据库文件中,用ADO的SQL语句创建数据表(这个不难,解决好
ConnectString就可以了);
3、动态调整ADOConnect和ADOQuery的属性,令其在指定数据库文件的数据表中
保存数据;
4、读取指定数据库文件的指定数据表内容,必要时,用SQL进行多数据库的表同
步访问(这一点最难)。
准备进行针对性的实验。如果不行的话,会考虑混合使用DAO或ODBC,以及KADAO
这样的控件帮助解决问题。等有了结果再汇总给大家参考讨论。
 
//第一个问题,建立Access数据库
function GetTempPathFileName():string;
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(result);
end;

function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//建立Access文件,如果文件存在则失败
var
STempFileName:string;
vCatalog:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
 
多人接受答案了。
 
后退
顶部