为什么我用论坛经典的用ADO压缩Access2000库的方法无法成功了,(没有分了,补满50分,我就结贴)谢谢各路打下了

icwin 2004-12-24 11:12:24
我用您的方法单是始终不能成功,非常感谢了

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleSysError with message '不正确的变量类型。'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
===
// 用ADO压缩Access2000库
#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);
}
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");
}
...全文
206 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
esway 2004-12-27
  • 打赏
  • 举报
回复
Access2000库有一个选项是关闭数据库时自动压缩,所以不用进行外部操作。
具体方法:打开你所操作的Access2000文件,菜单栏->工具->选项->常规->选择“关闭时压缩”->确定,搞定。
以上方法可以通过压缩数据冗余,解决不断操作Access2000库产生的冗余,导致文件很大,操作速度变慢的问题。
真如实观 2004-12-26
  • 打赏
  • 举报
回复
哈哈!同志们,我用下面成了:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=.\\equip.mdb";
String Provider2="Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=.\\equip1.mdb";
JetEngine1->CompactDatabase((WideString)Provider1,(WideString)Provider2);
}
直接用#import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum")是不行的,应该点菜单“Import Type Library”把"MSJRO.DLL"引入才可以。
真如实观 2004-12-26
  • 打赏
  • 举报
回复
我按上面的方法引入库:msadox.dll,然后安装,创建Access数据库测试代码:
String Provider1="Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=.\\db1.mdb";
TVariant tv;
tv=Catalog1->Create((WideString)Provider1);
ShowMessage(tv);

结果在当前目录下创建了一个名为db1.mdb的Access数据库.
whitelion 2004-12-25
  • 打赏
  • 举报
回复
我已经不用这种办法压缩 了

做一个空库,然后把数据直接加进去,和压缩的效果是一样的
icwin 2004-12-25
  • 打赏
  • 举报
回复
各位楼上的大大门,问题我以近解决有两个问题找承德:
主要示,驱动的问题
我使用了chinabcb提供的,widestring(provide1),解决了
lovebcb 2004-12-25
  • 打赏
  • 举报
回复
好久不用了,记得是先把数据连接断开,然后再处理。
真如实观 2004-12-25
  • 打赏
  • 举报
回复
我看了你的代码,只不过调用ADOX的OLE对象,我在vc下用原生的ADO方法压缩很好,就是在bcb下不行,纳闷!居然连:
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum")
都用不了,妈的,ADOExpress组件也应该含有CompactDatabase方法吧!
::CoInitialize(NULL);
IJetEnginePtr jet(__uuidof(JetEngine));
HRESULT hr = jet->CompactDatabase(_bstr_t(strDatabaseSource.GetBuffer(0)),
_bstr_t(strDatabaseDestination.GetBuffer(0)));
jet.Release();
::CoUninitialize();

IJetEnginePtr接口在ADOExpress组件见到踪影了:看看adojet.h:
#ifndef __IJetEngine_FWD_DEFINED__
#define __IJetEngine_FWD_DEFINED__
typedef interface IJetEngine IJetEngine;
#endif /* __IJetEngine_FWD_DEFINED__ */
public:
virtual /* [helpcontext] */ HRESULT STDMETHODCALLTYPE CompactDatabase(
/* [in] */ BSTR SourceConnection,
/* [in] */ BSTR Destconnection) = 0;
////////////////////////////////////////////////////
不过我知道这和#import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum")得到的头文件应该是一样的,但是......
icwin 2004-12-25
  • 打赏
  • 举报
回复
回复人: constantine(飘遥的安吉儿) ( ) 信誉:111 2004-12-25 15:50:00 得分: 0


还有就是最好吧mdac升级到2.8


=============================
大大,您的意思是?我的是win2000+bcb6+up4
谢谢了‘
icwin 2004-12-25
  • 打赏
  • 举报
回复
我已经不用这种办法压缩 了

做一个空库,然后把数据直接加进去,和压缩的效果是一样的
==============================================
老大怎么操作啊?谢谢了!
constantine 2004-12-25
  • 打赏
  • 举报
回复
还有就是最好吧mdac升级到2.8
samchoy 2004-12-25
  • 打赏
  • 举报
回复
Adoobj.OleProcedure("CompactDatabase",Provider1,Provider2);
改成
Adoobj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());
就行了

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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