看来是不能用adodataset的savetofile、loadfromfile来做备份、恢复用了,不知ado下有什么好方法实现备份、恢复呢?(50分)

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

yangkee

Unregistered / Unconfirmed
GUEST, unregistred user!
loadfromfile后要想updatebatch除非是数据上次修改过而未提交,所以不能实现restore。
updatebatch的结果是没有数据存到数据库中。ado+access下有什么好方法实现备份、恢复呢?
还是sqlserver好啊,直接有备份的语句。不只是简单的select into ,insert in。
 
loadfromfile、savetofile是用于做离线的本地CACHE用的,不是用于备份数据库的。
对ACCESS来说,简单地FILECOPY不就可以了嘛,不过备份前要确保所有客户端请求都已
提交,具体方法可以管理员用户重新登录后,以独占方式打开数据库,如果出错,说明
有人已打开该数据库。
不然的话,就做两个连接,用成批移动。这样太麻烦。
 
to douh:
简单地FILECOPY并不好,一是.mdb的文件相当大,二是不灵活,比如我只想备份12月份的数据,
只想恢复8月份的数据,用FILECOPY就不行了。ado中又没有batchmove的等价用法。
还有就是要压缩access数据库文件:OLE DB Provider for Microsoft Jet中有一个interface:
IJetCompact,其语法如下:不知在delphi中应当如何调用?
IJetCompact::Compact
Compacts or repairs a database, creating a new database. The old database is
retained unchanged.

Syntax
HRESULT IJetCompact::Compact(
ULONG cPropertySets,
DBPROPSET rgPropertySets[]);

Parameters
cPropertySets
[in]
The number of DBPROPSET structures in rgPropertySets. If this is zero,
the provider ignores rgPropertySets and the method does nothing.
rgPropertySets
[in/out]
An array of DBPROPSET structures containing properties and values to be set.
If the data source object or enumerator is uninitialized, the properties
specified in these structures must belong to the Initialization property group.
If the data source object is initialized, the properties must belong to the
Data Source property group. If the enumerator is initialized, it is an error
to call this method. If the same property is specified more than once in
rgPropertySets, the value used is provider-specific. If cPropertySets is zero,
this parameter is ignored.


 
yangkee:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明 http://www.delphibbs.com/delphibbs/rules.htm
 
IJetCompact在delphi中的调用:


Function CompactAndRepair(sOldMDB : String; sNewMDB : String) : Boolean;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
var
oJetEng : JetEngine;
begin
sOldMDB := sProvider + 'Data Source=' + sOldMDB;
sNewMDB := sProvider + 'Data Source=' + sNewMDB;

try
oJetEng := CoJetEngine.Create;
oJetEng.CompactDatabase(sOldMDB, sNewMDB);
oJetEng := Nil;
Result := True;
except
oJetEng := Nil;
Result := False;
end;
end;


示例:

if CompactAndRepair('e:/Old.mdb', 'e:/New.mdb') then
ShowMessage('Successfully')
else
ShowMessage('Error…');

重要注意:
1- 在你的uses语句中加入JRO_TLB单元。
2- 在压缩的过程中,其它人不能打开或使用数据库。
3- 如果你的编译器报告没有找到JRO_TLB单元,就按以下步骤去做:
a) 在Delphi IDE中选择Project - Import Type Library.
b) 往下翻直到你找到“Microsoft Jet and Replication Objects 2.1 Library”.
c) 点击Install按钮
d) 重新编译
 
谢谢lzliang,access压缩的问题我已搞定。
至于备份我还是只有用insert into ,select into 了,不知道有没有高手有什么更好的办法?
 
多人接受答案了。
 

Similar threads

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