利用 vs2015(64位)连接odbc 数据源(我创建的是 基于oracle12c 的数据源),写了MFC程序,出现以下错误

小C大加 2015-10-31 11:48:16






void CEmailManagerDlg::OnClickedBtnconn()
{
// TODO: 在此添加控件通知处理程序代码
// TODO: Add your control notification handler code here
if (!UpdateData())return;

//判断数据库是否连接
if (m_db.IsOpen())
{
AfxMessageBox(_T("数据库已连接"));
return;
}

//数据库配置参数不能为空
if (m_strDBSource.IsEmpty() || m_strUserName.IsEmpty() || m_strPassword.IsEmpty())
{
AfxMessageBox(_T("数据库配置参数不能为空"));
return;
}

//创建连接字符串
CString strConnect;
strConnect.Format(_T("DSN=%s; UID=%s; PWD=%s"), m_strDBSource, m_strUserName, m_strPassword);

//打开数据库的连接,并且捕获异常

TRY{
m_db.OpenEx(strConnect,CDatabase::noOdbcDialog);
}
CATCH(CDBException, ex)
{
AfxMessageBox(ex->m_strError);
AfxMessageBox(ex->m_strStateNativeOrigin);
}
END_CATCH
}
...全文
7373 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-08
  • 打赏
  • 举报
回复
参考3楼
wenluderen 2017-06-07
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
百度搜“ODBC RDO ADO”
64位的操作系统 C:\Windows\SysWOW64里面的odbcad32.exe 到底是32位的 还是64位? 如果是32位 为啥路径上写的SYSWOW64. 如果是64位的,为啥找不到ODBC的驱动? 好生奇怪。 感觉这个地方有很多概念 ,太模糊了。 ××××××××××××××××××××××××××××××××××××××××××× 我个人猜测,64位的系统,C:\Windows\SysWOW64里面放置是32位的程序。
赵4老师 2017-06-06
  • 打赏
  • 举报
回复
百度搜“ODBC RDO ADO”
wenluderen 2017-06-05
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
赵老师,最近在做 和Mysql数据库的通讯,在网上找到一个教程,说是ODBC,但是代码里面却有ADO ,好生迷茫.
//#pragma once
 // ADOConn.h: interface for the ADOConn class.
 //
 //////////////////////////////////////////////////////////////////////
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")

// #import "msado15.dll"                                          no_namespace rename("EOF", "adoEOF")

 #if !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
 #define AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_

 #if _MSC_VER > 1000
 #pragma once
 #endif // _MSC_VER > 1000

 class ADOConn
  {
	// 定义变量
		 public:
   //添加一个指向Connection对象的指针:
  _ConnectionPtr m_pConnection;
  //添加一个指向Recordset对象的指针:
  _RecordsetPtr m_pRecordset;
 // 定义方法
 public:
	  ADOConn();
	 virtual ~ADOConn();
	  // 初始化—连接数据库
	  void  OnInitADOConn();
	 // 执行查询
	  _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
	  // 执行SQL语句,Insert Update _variant_t
	  BOOL ExecuteSQL(_bstr_t bstrSQL);
      void ExitConnect();
 };
 #endif // !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)

 // ADOConn.cpp: implementation of the ADOConn class.
 //
  //////////////////////////////////////////////////////////////////////

 #include "stdafx.h"
 #include "ADOConn.h"

 #ifdef _DEBUG
 #undef THIS_FILE
 static char THIS_FILE[] = __FILE__;
 #define new DEBUG_NEW
 #endif

  //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
  //////////////////////////////////////////////////////////////////////

 ADOConn::ADOConn()
 {
 }

 ADOConn::~ADOConn()
 {
 }
 // 初始化—连接数据库
 void  ADOConn::OnInitADOConn()
  {
	 // 初始化OLE/COM库环境 
	::CoInitialize(NULL);
	 try
	 {
	  // 创建Connection对象
	    m_pConnection.CreateInstance("ADODB.Connection");
		m_pConnection->Open("DSN=ASCIIGSZ;Server= localhost;Database=gszp17010", "root", "123456", adModeUnknown);
	 }
	// 捕捉异常
	 catch (_com_error e)
	{
		  // 显示错误信息
		 AfxMessageBox(e.Description());
     }
 }

 // 执行查询
 _RecordsetPtr&  ADOConn::GetRecordSet(_bstr_t bstrSQL)
  {
	    try
		     {
		        // 连接数据库,如果Connection对象为空,则重新连接数据库
			        if (m_pConnection == NULL)
		             OnInitADOConn();
		        // 创建记录集对象
			        m_pRecordset.CreateInstance(__uuidof(Recordset));
		         // 取得表中的记录
			        m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
		    }
	    // 捕捉异常
		    catch (_com_error e)
		     {
		         // 显示错误信息
			        AfxMessageBox(e.Description());
		    }
	     // 返回记录集
		     return m_pRecordset;
	}

  // 执行SQL语句,Insert Update _variant_t
 BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
  {
	//    _variant_t RecordsAffected;
		     try
		      {
		        // 是否已经连接数据库
			         if (m_pConnection == NULL)
			             OnInitADOConn();
		         // Connection对象的Execute方法:(_bstr_t CommandText, 
			         // VARIANT * RecordsAffected, long Options ) 
			         // 其中CommandText是命令字串,通常是SQL命令。
			        // 参数RecordsAffected是操作完成后所影响的行数, 
			         // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
			        // adCmdProc-存储过程;adCmdUnknown-未知
			        m_pConnection->Execute(bstrSQL, NULL, adCmdText);
		         return true;
		     }
	     catch (_com_error e)
		      {
		         AfxMessageBox(e.Description());
		         return false;
		    }
	 }

 void ADOConn::ExitConnect()
  {
	     // 关闭记录集和连接
		     if (m_pRecordset != NULL)
		        m_pRecordset->Close();
	     m_pConnection->Close();
	    // 释放环境
		     ::CoUninitialize();
 }
这个到底算是ADO还是ODBC。 如果不是ADO,此处却引用ADO的动态库。 如果不是ODBC,教程里面却要配置ODBC。 ×××××××××××× 我的操作系统是WIn7 64位中文旗舰版。 Mysql是mysql-5.7.10-winx64 ,VS是 2015 企业版。 出现的问题和楼主是一样的 驱动程序和应用程序之间的体系结构不匹配
darter_csdn 2016-11-22
  • 打赏
  • 举报
回复
MFC ODBC似乎对X64编译存在支持性问题,晕
darter_csdn 2016-11-01
  • 打赏
  • 举报
回复
肯定继续ODBC的,这个最基本。VB才用ADO! ADO,那个版本太乱了,在Win10X64下会晕死你,即使你编译成功了,运行也一样不行。
Dobzhansky 2016-10-17
  • 打赏
  • 举报
回复
继续用 ODBC
darter_csdn 2016-10-15
  • 打赏
  • 举报
回复
Win10X64,VS2015,ODBC数据源设置SQLConfigDataSoure函数都有问题,代码编译时没问题,就是编译连接不上,生成不了exe程序。 似乎与ODBCCP32.lib这个东东有关。 看来是不能用ODBC了!
赵4老师 2016-09-19
  • 打赏
  • 举报
回复
你没有注册64位的odbc for excel驱动。我猜。 可能你需要安装Excel64位版。
MiDEu 2016-09-19
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 MiDEu 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
64位程序 如何使用32位odbc 我现在OpenEx报异常[/quote] 将自行将下面文字中的“A语言”替换为“64位程序”,“B语言”替换为“一个32位使用32位odbc的程序”: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸! [/quote] 但是我现在遇到这样的问题 我编写一个MFC程序 把list control里面的内容保存到excel里面, 当我程序用32位编译 就可以成功保存 用64位时候就提示保存失败 抛出的异常显示“未发现数据源名称并且位置的默认的驱动程序”
赵4老师 2016-09-18
  • 打赏
  • 举报
回复
将自行将……→请自行将……
赵4老师 2016-09-18
  • 打赏
  • 举报
回复
引用 4 楼 MiDEu 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
64位程序 如何使用32位odbc 我现在OpenEx报异常[/quote] 将自行将下面文字中的“A语言”替换为“64位程序”,“B语言”替换为“一个32位使用32位odbc的程序”: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
MiDEu 2016-09-18
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
64位程序 如何使用32位odbc 我现在OpenEx报异常
赵4老师 2015-11-02
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
pstrunner 2015-11-01
  • 打赏
  • 举报
回复
在百度上搜【驱动程序和应用程序之间的体系结构不匹配】就能找到答案。
zyq5945 2015-10-31
  • 打赏
  • 举报
回复
LZ好潮啊,都VS2015了。 报错好像是说64位的程序加载了32的驱动程序,调用不了。 可以换ADO试试,ADO比ODBC好用,应该没有这个问题。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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