MFC 通过ODBC方式连接Oracle数据库的方法

公司有个项目,客户指定要使用oracle数据库,因此有一个VC开发的应用需要连接Oracle数据库,评估了多种方案,最终决定使用ODBC的方式进行访问,此文详细记录下操作的步骤:

1.下载安装oracle快速客户端和odbc驱动并安装

在官网Instant Client for Windows 32-bit,下载instantclient-basic-nt-21.3.0.0.0.zip和instantclient-odbc-nt-21.3.0.0.0.zip两个文件,注意版本需要一致。解压上面两个包,把解压后的文件放在同一个目录(合并),注意2个包解压后的所有文件必须放在一个目录下,假设是D:\oracletool\instantclient_21_3。使用管理员权限打开CMD,进入该目录,运行odbc_install.exe进行安装。然后在network/admin下手工编辑tnsnames.ora,配置链接串。运行64位ODBC驱动配置程序“C:\windows\SysWOW64\odbcad32.exe”,

配置odbc驱动,并测试连接成功!

注意,有可能需要安装VC_redist.x86(2017)。

 2. MFC测试程序连接,代码如下:

int test()
{    
    if (!AfxOleInit())
	{
		return 0;
	}
	
	CString strConn;
	HRESULT hr;
	_ConnectionPtr m_Conn;

	
	strConn.Format("Provider=MSDASQL.1;DSN=ORACLE;UID=XXXXXXX;PWD=XXXXXXXX");
	
	try
	{
		hr = m_Conn.CreateInstance(__uuidof(Connection));
		if(FAILED(hr))
		{   
			AfxMessageBox("fail CreateInstance");
			return 0;
		}
		hr = m_Conn->Open(strConn.GetBuffer(0), "", "", -1);
		if(FAILED(hr))
		{   
			AfxMessageBox("fail Conn Open");
			return 0;
		}
		_RecordsetPtr pRecordSet;
		hr = pRecordSet.CreateInstance(__uuidof(Recordset));
		if(FAILED(hr))
		{   
			return 0;
		}
		hr = pRecordSet->Open("select * from BASE_ORGANIZE where f_organizeid='9698e2b4-0dd9-4d40-8ef5-9699bb135826'",m_Conn.GetInterfacePtr(), adOpenStatic, adLockBatchOptimistic, -1);
		_variant_t value;
		if (!pRecordSet->adoEOF)
		{
			value = pRecordSet->GetCollect("F_ShortName");
			if ((value.vt != VT_NULL)&&(strlen((char *)_bstr_t(value)) > 0))
			{					
				CString strName = (char *)_bstr_t(value);
				AfxMessageBox(strName);
				
			}
		}
		
		if(FAILED(hr))
		{   
			return 0;
		} 
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.ErrorMessage());
		AfxMessageBox(e.Description());
		return 0;
	}
	catch(...)
	{
		AfxMessageBox("...");
		return 0;
	}
}

此外注意一点,当查询结果是中文并且出现乱码后,需要设置系统的环境变量,NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK 经过测试可以解决SQL通过ODBC查询中文乱码的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值