为什么压缩ACCESS总是出错啊?

mcuos 2005-11-10 05:57:11
用ADO压缩Access2000库  作者: 佚名

关 键 字:ADO,压缩Access2000数据库,Microsoft.Jet.OLEDB.4.0

本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=492&d=o1s23x
#include "utilcls.h"

void CompactDatabase(String f1,String psw1, String f2,String psw2)
{
String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f1 + ";Jet OLEDB:Database Password=" + psw1;
String Provider2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f2 + ";Jet OLEDB:Database Password=" + psw2;

Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
Adoobj.OleProcedure("CompactDatabase",Provider1,Provider2);
AdoObj.Clear( ); // 释放 ADO对象
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String f1="yhecdagl1.mdb"; // 源库1
String psw1="yhecdagl"; // 密码1

String f2="yhecdagl2.mdb"; // 新目的库2
String psw2="yhecdagl2"; // 新密码2

String dir=ExtractFilePath(Application->ExeName);
if (FileExists(f2))
DeleteFile(f2);
CompactDatabase(dir+f1,psw1,dir+f2,psw2);
ShowMessage("Finished");
}

这段代码在很多网站都提供了,但是我把它加到工程运行时总是提示“未知名称”,什么原因造成的呀?
下面是我改了一点点的程序:
void TestCompactDatabase(String f1,String psw1, String f2,String psw2)
{
String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f1 + ";Jet OLEDB:Database Password=" + psw1;
String Provider2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f2 + ";Jet OLEDB:Database Password=" + psw2;

Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
Adoobj.OleProcedure("TestCompactDatabase",Provider1,Provider2);
Adoobj.Clear(); // 释放 ADO对象
}

void __fastcall TMainForm::Button7Click(TObject *Sender)
{
String f1="TaxBox.mdb"; // 源库1
String psw1=""; // 密码1

String f2="TaxBox1.mdb"; // 新目的库2
String psw2=""; // 新密码2

String dir=ExtractFilePath(Application->ExeName);

if (FileExists(f2))
DeleteFile(f2);
TestCompactDatabase(dir+f1,psw1,dir+f2,psw2);
ShowMessage("Finished");
}
...全文
224 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jukyy 2005-11-14
  • 打赏
  • 举报
回复
写成一段代码加在工程的Application->Initialize();之后就没有这个问题了。呵呵呵。
mcuos 2005-11-11
  • 打赏
  • 举报
回复
谢谢老妖提醒,我把程序改了一下,搞定了!

void TestCompactDatabase(String f1,String psw1, String f2,String psw2)
{
WideString Provider1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f1 + ";Jet OLEDB:Database Password=" + psw1;
WideString Provider2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ f2 + ";Jet OLEDB:Database Password=" + psw2;

Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
Adoobj.OleProcedure("CompactDatabase",Provider1,Provider2);
Adoobj.Clear(); // 释放 ADO对象
}

void __fastcall TMainForm::Button7Click(TObject *Sender)
{
String f1="TaxBox.mdb"; // 源库1
String psw1=""; // 密码1

String f2="TaxBoxBak.mdb"; // 新目的库2
String psw2=""; // 新密码2

String dir=ExtractFilePath(Application->ExeName);

if(FileExists(f2))
DeleteFile(f2);
ADOConnection1->Connected = false;
TestCompactDatabase(dir+f1,psw1,dir+f2,psw2);
ShowMessage("Finished");
}
LngDotin 2005-11-10
  • 打赏
  • 举报
回复
是的,是的,~~~~~~~~
ccrun.com 2005-11-10
  • 打赏
  • 举报
回复
这是从我代码中取出来的部分,注意在压缩前保证该数据库没有在使用中。

bool MyCompactDatabase(LPSTR lpMdbFileName)
{
bool bReturn(false);
String strFileTemp = ChangeFileExt(lpMdbFileName, ".Tmp");
String strProvider1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
String(lpMdbFileName) + ";Jet OLEDB:Database Password=" + g_str;
String strProvider2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
strFileTemp + ";Jet OLEDB:Database Password=" + g_str;

Variant AdoObj;
try
{
if(FileExists(strFileTemp))
DeleteFile(strFileTemp);
AdoObj = Variant::CreateObject("JRO.JetEngine");
AdoObj.OleProcedure("CompactDatabase",
WideString(strProvider1), WideString(strProvider2));
if(FileExists(lpMdbFileName))
DeleteFile(lpMdbFileName);
RenameFile(strFileTemp, lpMdbFileName);
bReturn = true;
}
catch(...)
{
AdoObj.Clear();
}
AdoObj.Clear();
return bReturn;
}

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧