公司有个项目,客户指定要使用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查询中文乱码的问题。