MFC C++ 使用ODBC方式调用Oracle数据库的详细步骤

发布于:2025-08-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

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;
}

以上就是详细的过程。


网站公告

今日签到

点亮在社区的每一天
去签到