1.下载oracle (这里使用的是win 32 21.18.0版本)
- instantclient-basic-nt-21.18.0.0.0dbru.zip
- instantclient-odbc-nt-21.18.0.0.0dbru.zip
2.安装oracle
- 解压instantclient-basic-nt-21.18.0.0.0dbru.zip和instantclient-basic-nt-21.18.0.0.0dbru.zip
并将解压后的两个文件的instantclient_21_18合并,以管理员方式运行odbc_install.exe
- 设置环境变量
- .添加系统环境变量
变量名 ORACLE_HOME
变量值 D:\Tools\Oracle\instantclient_21_18
变量名TNS_ADMIN
变量值 %ORACLE_HOME%\network\admin
注意:此配置解决中文乱码问题
变量名 NLS_LANG
变量值AMERICAN_AMERICA.AL32UTF8
- 添加用户变量
选中Path,双击
点击‘新建’,添加 %ORACLE_HOME%;%ORACLE_HOME%\bin;
3.ODBC数据源配置
双击C:\Windows\SysWOW64下的‘odbcad32.exe
选择驱动程序,找到Oracle in instantclient_21_18,选中并点击‘确定’
- 切换到‘系统DSN’,点击‘添加’,选中Oracle in instantclient_21_18,点击‘完成’
添加相关信息后,点击‘Test Connection’,测试是否能connect success,如图
5.修改tnsnames.ora文件
如instantclient_21_18\\network\admin目录下没有tnsnames.ora文件,则需要手动创建,设置实际的数据库的相关配置
ServerTest =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cxx)
(CHARACTERSET = AL32UTF8)
)
)
参数解释:
ServerTest 对应ODBC数据源 中的TNS Service Name
6.查询环境变量是否设置成功
方法一:
echo %ORACLE_HOME%
echo %TNS_ADMIN%
echo %PATH%
7.C++ 调用Oracle
连接服务器,使用DSN,DATABASE,SERVER,UID,PWD连接
BOOL CDBOracleConnector::Connect(LPCTSTR lpszDSN, LPCTSTR lpszDatabase, LPCTSTR lpszServer, LPCTSTR lpszUser, LPCTSTR lpszPwd, int queryTimeout, int connectTimeout)
{
Disconnect();
m_strLastError = _T("");
CString strConnect;
strConnect.Format(_T("DSN=%s;DATABASE=%s;SERVER=%s;UID=%s;PWD=%s"), lpszDSN, lpszDatabase, lpszServer, lpszUser, lpszPwd);
WriteLog(m_logPath, LOG_NAME, strConnect);
try {
m_db.SetLoginTimeout(connectTimeout);
m_db.SetQueryTimeout(queryTimeout);
//打开数据库连接
LPCTSTR p = (LPCTSTR)strConnect;
if (!m_db.OpenEx(strConnect, CDatabase::noOdbcDialog))
{
m_strLastError = _T("无法打开数据库连接");
return FALSE;
}
}
catch (CDBException* e) {
m_strLastError = e->m_strError;
e->Delete();
WriteLog(m_logPath, LOG_NAME, m_strLastError);
return FALSE;
}
return true;
}
查询
CString CDBOracleConnector::GetOperatorID(LPCTSTR lpszOperatorID, LPCTSTR lpszOperatorPwd)
{
m_strLastError = _T("");
try {
CString strSQL;
strSQL.Format(_T("select * from user_t ")
_T(" where user_name='%s' ")
_T("and password='%s'"),
lpszOperatorID, lpszOperatorPwd);
CString strLog;
CRecordset rs(&m_db);
rs.Open(CRecordset::forwardOnly, strSQL, CRecordset::readOnly);
CString strStatus = _T("");
if (!rs.IsEOF()) {
rs.GetFieldValue(_T("ID"), strStatus);
}
rs.Close();
return strStatus;
}
catch (CDBException* e) {
m_strLastError.Format(_T("检查失败: %s"), e->m_strError);
e->Delete();
return _T("查询错误");
}
return 0;
}
以上就是详细的过程。