MDB数据压缩(200分)

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

yaya8163

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写CGI,以下代码编译成功,但是执行出错,请各路高手指点
dbtemp.mdb数据库有生成
function CompactDatabase():boolean;
//压缩与修复数据库,覆盖源文件
const
SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Database Password=%s;';
var
temp:string;
JE:OleVariant;
begin
temp:=LeftStr(WebDirectory,length(WebDirectory)-4)+'db/' ;
try
try
JE:=CreateOleObject('JRO.JetEngine');//建立OLE对象,函数结束OLE对象超过作用域自动释放
OleCheck(JE.CompactDatabase(format(SConnectionString,[temp+'db.mdb','']),
format(SConnectionString,[temp+'dbtemp.mdb',''])));//压缩数据库
DeleteFile(temp+'db.mdb');
RenameFile(temp+'dbtemp.mdb', temp+'db.mdb');
except
result:=false;//压缩失败
end;
finally
FreeAndNil(JE);
end;
 
去掉FreeAndNil(JE);
因为JE实际上是一个OLE的COM对象,而不是TObject对象,所以不应该通过FreeAndNil释放。实际上,离开作用域之后,这个对象会自动释放的。你可以可以通过JE := nil这样来强制释放。
 
楼上说的是
因为Ole对象实际上对接口的后期绑定。所以只需要JE := nil;即可降低饮用计数,以达到释放对象的目的。
 
我单步调试了出错在这句
JE:=CreateOleObject('JRO.JetEngine');
 
const


DB_AccessDBConnStr = 'Data Source="%S";' +
'Jet OLEDB:Database Password="%S"';


function MCompactAccessDb(SourceFileName,SourcePassword,TargetFileName,TargetPassword:String):Boolean;
var
DbConn:OleVariant;
SourceCompactStr:String;
TargetCompactStr:String;
begin
Result:=False;
DbConn:=CreateOleObject('JRO.JetEngine');
If FileExists(SourceFileName) then
begin
If FileExists(TargetFileName) then
begin
if Not DeleteFile(TargetFileName) then
begin
exit;
end;
end;
SourceCompactStr:=Format(DB_AccessDBConnStr,[SourceFileName,SourcePassword]);
TargetCompactStr:=Format(DB_AccessDBConnStr,[TargetFileName,TargetPassword]);
Try
DbConn.CompactDatabase(SourceCompactStr,TargetCompactStr);
Result:=True;
except
end;
end;
end;
 
to yaya8163:
我单步调试了出错在这句
JE:=CreateOleObject('JRO.JetEngine');
--------------------------------------------
这里出错是因为ado的驱动问题。你可以试试在干净的系统下能否成功。
解决办法是在你出问题的系统下用regsvr32注册一下“系统盘:/Program Files/Common Files/System/ado”目录下的msadox.dll和msjro.dll
 
我写的其他页面可以正常打开修改数据库,驱动不存在问题
 
要不你把源码发来看看
cgcpj@tom.com
 
我将代码放在ASP中可以正确执行
 
我贴出来的就是源码
 
这段代码居然只能压缩没有损坏的数据库,如果数据库已经损坏就执行出错。只能用ACCESS打开。不是说Compact已经带有修复功能?
sub CompactData()
Dim fso, Engine, strDBPath
strDBPath = left(dbPath,instrrev(DBPath,"/"))
Set fso = Server.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(dbPath) Then
Set Engine = CreateObject("JRO.JetEngine")
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath," Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & "temp.mdb"
fso.CopyFile strDBPath & "temp.mdb",dbpath
fso.DeleteFile(strDBPath & "temp.mdb")
Set fso = nothing
Set Engine = nothing
response.write "数据库压缩成功!"
Else
response.write "数据库没有找到!"
End If
end sub
 

Similar threads

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