热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求win64压缩mdb文件的代码

如题,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 个解决方案

#1


要不然安装jet?我也正发愁这事呢。

#2


本帖最后由 ccrun 于 2014-07-13 17:15:54 编辑
这个错误跟操作系统版本没什么关系。
AdoObj.OleProcedure(L"CompactDatabase",src.w_str(),dest.w_str());
这一行代码,改成:
AdoObj.OleProcedure("CompactDatabase", WideString(src), WideString(dest));

即可。一般人我不会告诉他的。

64 位 Windows 8.1 中测试,没有任何问题。

#3


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。

#4


故障依旧是意料中事。

1. String类的w_str()方法已不建议使用。
2. 连接字符串中,数据库文件名用全路径。

#5


故障依旧。
这一行AdoObj.OleProcedure(L"CompactDatabase", src.w_str(), dest.w_str() );
已经按妖哥的说法改成AdoObj.OleProcedure(L"CompactDatabase", WideString(src), WideString(dest)); 
数据库文件也改成全路径,都是一样的错误提示。
会不会包含的头文件不对,我用的是 #include ,2009版CBuilder

#6


不用说那么多了。来吧,把你完整的代码贴上来。

#7


完整的代码就在3楼了。
只是其中的第五行按妖哥的指导改了很多个样子 但运行都不成功,包括第二和第三行指定数据库文件也改成了全路径,都是不行。
有劳各位多关注

#8


在64位的系统中编译32位的应用程序是正常的。但是编译成64位的就会报类未注册的错误,这个确实是Jet的问题。
看看这里的解决方法:
http://www.codeproject.com/Questions/464072/The-Microsoft-Jet-OLEDB-provider-is-not-regist

#9


我的故障是运行时错误,不是编译错误,而且用的2009版貌似只能编译32位程序。
回头把编译出来的EXE找台32位机器试试,迟些汇报32位运行结果。

#10


我说的“编译成64位的就会报类未注册的错误” 就是指运行时错误。

并且,问题主要是:编译生成64位的程序,运行时才会出错。
生成的32位的程序,不管是在64位操作系统还是32位的操作系统运行,都没有问题。
不知道我描述的你看明白没有。

#11


刚试了,把生成的EXE拿到32位XP上跑,执行到这部分功能时直接死机。因为不是调试环境,没有报错误代码。
不知如何是好了。

#12


在代码中,适当的位置插入一些调试代码,比如OutputDebugString之类的,然后在没有调试环境的机器上运行,用DbgView等工具查看输出,就可以大致确定是哪一些代码附近出错。

#13


OutputDebugString试过的,确实就是
AdoObj.OleProcedure(L"CompactDatabase", WideString(src), WideString(dest)); 出错。
要不,劳烦妖哥试试我的代码:
#include 

  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", WideString(src), WideString(dest)); 
    AdoObj.Clear();
    CoUninitialize();

#14


不是说好了用全路径吗?怎么又变成相对路径了?

#15


好吧,我真的是用的全路径,只是这段代码怕妖哥你的电脑没有我电脑上的R:盘,才删掉的。想弄个巧反而让妖哥误会了

#16


刚才细分析一下,发现是你的连接字符串中的密码字段有问题,改成这样:

CoInitialize(NULL);

String src = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\ccrun\\123.mdb;Jet OLEDB:Database Password=123456";
String dest = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\ccrun\\123.mps;Jet OLEDB:Database Password=123456";

Variant AdoObj = Variant::CreateObject(L"JRO.JetEngine");
AdoObj.OleProcedure(L"CompactDatabase", WideString(src), WideString(dest));
AdoObj.Clear();

CoUninitialize();


我代码中的全路径,你要改成自己的,我相信你会搞定。

#17


妖哥真神人也,热心,又有水平,不服不行。
改了密码串,问题解决。

#18


补充一句,使用相对路径也是可以的。

#19


引用 16 楼 ccrun 的回复:
刚才细分析一下,发现是你的连接字符串中的密码字段有问题,改成这样:

CoInitialize(NULL);

String src = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\ccrun\\123.mdb;Jet OLEDB:Database Password=123456";
String dest = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\ccrun\\123.mps;Jet OLEDB:Database Password=123456";

Variant AdoObj = Variant::CreateObject(L"JRO.JetEngine");
AdoObj.OleProcedure(L"CompactDatabase", WideString(src), WideString(dest));
AdoObj.Clear();

CoUninitialize();


我代码中的全路径,你要改成自己的,我相信你会搞定。


请问最后到底解决了吗,急求答复

#20


引用 2 楼 ccrun 的回复:
这个错误跟操作系统版本没什么关系。
AdoObj.OleProcedure(L"CompactDatabase",src.w_str(),dest.w_str());
这一行代码,改成:
AdoObj.OleProcedure("CompactDatabase", WideString(src), WideString(dest));

即可。一般人我不会告诉他的。

64 位 Windows 8.1 中测试,没有任何问题。

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;

#21


引用 20 楼 u010747411 的回复:
我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?

#22


引用 21 楼 ccrun 的回复:
Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?


引用 21 楼 ccrun 的回复:
Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?

先谢谢您了,还以为这么久了您不会回复了呢,谢谢了

我的环境是server2003,在vs2010上,执行以下代码

 CString csSourceConnection = _T("");
 CString csDestConnection = _T("");   
 csSourceConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strCopyMDBDir,_T(""));//strCopyMDBDir是拷贝原mdb文件路径
 csDestConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strNewMDBFilePath,_T(""));//新拷贝的mdb文件路径(拷贝的strCopyMDBDir目录下的mdb文件)
 if (!CJetEngine::CCompactDatabase(csSourceConnection,csDestConnection))
  return FALSE;
 ::DeleteFile(strCopyMDBDir);

#23


引用 22 楼 u010747411 的回复:
Quote: 引用 21 楼 ccrun 的回复:

Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?


引用 21 楼 ccrun 的回复:
Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?

先谢谢您了,还以为这么久了您不会回复了呢,谢谢了

我的环境是server2003,在vs2010上,执行以下代码

 CString csSourceConnection = _T("");
 CString csDestConnection = _T("");   
 csSourceConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strCopyMDBDir,_T(""));//strCopyMDBDir是拷贝原mdb文件路径
 csDestConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strNewMDBFilePath,_T(""));//新拷贝的mdb文件路径(拷贝的strCopyMDBDir目录下的mdb文件)
 if (!CJetEngine::CCompactDatabase(csSourceConnection,csDestConnection))
  return FALSE;
 ::DeleteFile(strCopyMDBDir);




引用 22 楼 u010747411 的回复:
Quote: 引用 21 楼 ccrun 的回复:

Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?


引用 21 楼 ccrun 的回复:
Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?

先谢谢您了,还以为这么久了您不会回复了呢,谢谢了

我的环境是server2003,在vs2010上,执行以下代码

 CString csSourceConnection = _T("");
 CString csDestConnection = _T("");   
 csSourceConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strCopyMDBDir,_T(""));//strCopyMDBDir是拷贝原mdb文件路径
 csDestConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strNewMDBFilePath,_T(""));//新拷贝的mdb文件路径(拷贝的strCopyMDBDir目录下的mdb文件)
 if (!CJetEngine::CCompactDatabase(csSourceConnection,csDestConnection))
  return FALSE;
 ::DeleteFile(strCopyMDBDir);


引用 22 楼 u010747411 的回复:
Quote: 引用 21 楼 ccrun 的回复:

Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?


引用 21 楼 ccrun 的回复:
Quote: 引用 20 楼 u010747411 的回复:

我用c++的 jet->compactdatabase解决不了,请问您知道方法吗?64位系统到底支不支持压缩mdb呀?,求回答;


什么叫解决不了?敢不敢把具体的出错提示,还有你的环境,还有你的代码详细说说?

先谢谢您了,还以为这么久了您不会回复了呢,谢谢了

我的环境是server2003,在vs2010上,执行以下代码

 CString csSourceConnection = _T("");
 CString csDestConnection = _T("");   
 csSourceConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strCopyMDBDir,_T(""));//strCopyMDBDir是拷贝原mdb文件路径
 csDestConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database password=%s"),strNewMDBFilePath,_T(""));//新拷贝的mdb文件路径(拷贝的strCopyMDBDir目录下的mdb文件)
 if (!CJetEngine::CCompactDatabase(csSourceConnection,csDestConnection))
  return FALSE;
 ::DeleteFile(strCopyMDBDir);

-----------------------------------------------------------------------------------------------------------------------------
以下是 ado.cpp中CJetEngine::CCompactDatabase(csSourceConnection,csDestConnection)的执行
try
{
::CoInitialize(NULL);
  IJetEnginePtr jet(__uuidof(JetEngine));  
  HRESULT hr = jet->CompactDatabase(_bstr_t(strDatabaseSource.GetBuffer(0)), _bstr_t(strDatabaseDestination.GetBuffer(0)));//在这里抛出异常 ,返回失败
  ::CoUninitialize();
  return hr == S_OK;
}
catch(...)
{
 ::CoUninitialize();
 return FALSE;
}

#24


你既然用VC,那显然是没有WideString这个类型的,换成BSTR吧

#25


一定要注意,问题的根源就在于字符串的编码格式。C++Builder中可以使用VCL中的WideString类型,VC的话,只能考虑BSTR了

推荐阅读
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 本文将在前几篇关于Android测试理论知识的基础上,通过ApiDemoTest实例详细探讨如何使用ApplicationTestCase进行Android应用测试。建议读者先阅读Android测试教程系列中的相关内容,以便更好地理解本文的实践部分。 ... [详细]
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • 探讨低代码行业发展现状,分析其未能催生大型企业的原因,包括市场需求、技术局限及商业模型等方面。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • Oracle 10g 和 11g 32位 OCI.DLL 文件下载
    32位 PL/SQL Developer 访问 64位 Oracle 11g 数据库时,需要使用 32位的 OCI.DLL 文件以确保正常连接和数据访问。本文将详细介绍如何获取并配置此文件。 ... [详细]
  • 本文将详细介绍 SQL 中的 SUM 函数及其用法,并通过具体示例展示如何在实际场景中应用。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
author-avatar
吕志心可和
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有