作者:吕志心可和 | 来源:互联网 | 2023-07-31 08:03
如题,64位系统,使用如下代码VariantAdoObjVariant::CreateObject(LJRO.JetEngine);AdoObj.OleProcedure(
如题,64位系统,使用如下代码
Variant AdoObj = Variant::CreateObject(L"JRO.JetEngine");
AdoObj.OleProcedure(L"CompactDatabase",src.w_str(),dest.w_str());
AdoObj.Clear();
CoUninitialize();
在第二句出错,提示只是“发生意外”。
然后,网上搜索到这么一句话:MS的文档指出自MDAC2.6开始便不再包含JET组件,而MDAC2.7是JRO的最后一个版本,而且JRO不能在WIN64上使用。看样子是M$怂恿我们用SQL SERVER了。
资料引用:http://www.knowsky.com/394168.html
求在64位系统能用的代码。
25 个解决方案
src和dest本来就是定义的UnicodeString,按妖哥的说法,试了
AdoObj.OleProcedure(L"CompactDatabase", WideString(src), WideString(dest)); 故障依旧,再试了
AdoObj.OleProcedure(UnicodeString(L"CompactDatabase"), WideString(src), WideString(dest)); 也不行,再试
AdoObj.OleProcedure(UnicodeString(L"CompactDatabase"), StringToOleStr(src), StringToOleStr(dest));也不行。
难道问题是由别的原因引起?完整的代码是下面的:
CoInitialize(NULL); //初始化COM对象
String src = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=records.mdb;Password=123456"; //连接字串
String dest = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=temdb000.mps;Password=123456";
Variant AdoObj = Variant::CreateObject(L"JRO.JetEngine");
AdoObj.OleProcedure(L"CompactDatabase", src.w_str(), dest.w_str() );
AdoObj.Clear();
CoUninitialize();
我的系统是win7_64。
故障依旧是意料中事。
1. String类的w_str()方法已不建议使用。
2. 连接字符串中,数据库文件名用全路径。
在64位的系统中编译32位的应用程序是正常的。但是编译成64位的就会报类未注册的错误,这个确实是Jet的问题。
看看这里的解决方法:
http://www.codeproject.com/Questions/464072/The-Microsoft-Jet-OLEDB-provider-is-not-regist
我的故障是运行时错误,不是编译错误,而且用的2009版貌似只能编译32位程序。
回头把编译出来的EXE找台32位机器试试,迟些汇报32位运行结果。
我说的“编译成64位的就会报类未注册的错误” 就是指运行时错误。
并且,问题主要是:编译生成64位的程序,运行时才会出错。
生成的32位的程序,不管是在64位操作系统还是32位的操作系统运行,都没有问题。
不知道我描述的你看明白没有。
刚试了,把生成的EXE拿到32位XP上跑,执行到这部分功能时直接死机。因为不是调试环境,没有报错误代码。
不知如何是好了。
在代码中,适当的位置插入一些调试代码,比如OutputDebugString之类的,然后在没有调试环境的机器上运行,用DbgView等工具查看输出,就可以大致确定是哪一些代码附近出错。
好吧,我真的是用的全路径,只是这段代码怕妖哥你的电脑没有我电脑上的R:盘,才删掉的。想弄个巧反而让妖哥误会了
妖哥真神人也,热心,又有水平,不服不行。
改了密码串,问题解决。
你既然用VC,那显然是没有WideString这个类型的,换成BSTR吧
一定要注意,问题的根源就在于字符串的编码格式。C++Builder中可以使用VCL中的WideString类型,VC的话,只能考虑BSTR了