C++ ADO方式连接oracle数据库
来源:互联网 发布:淘宝有哪些好的鞋店 编辑:程序博客网 时间:2024/06/05 15:52
在这里先做一个讲解ADO和ODBC的关系,及其调用关系。
图1
从图中可以看出来 ,ADO 可以看出来 比如我想要连接到Oracle数据库是后 ,可以通过两种途径的到我想要的ADO connection的 连接字符串 ,一种是通过直接的ODBC,在连接字符串里面就是DNS,这个由ODBC数据源管理器设置DNS(图2,图3指示),还有一种是通过OLEDB,也就是创建.udl文件的方式来得到这样的字符串(这种方式晚上有很多,基本都是通过这样的方式 ,我就不讲解了,还有 OLEDB 选择的不是数据源驱动,OLEDB其关管理选项里面有ODBC的选项,这也和图1是相匹配的)(图4)。 在这里我所用的是第一种方式来连接数据库,创建DNS的方法有两种,一种界面的方式windowODBC数据源管理器添加一条用户DNS,注意区分ODBC数据源管理器是64位还是32位。一种通过代码,通过写注册表的方式来创建DNS(我这里是通过代码的方式)。 (注: 代码封装DLL在CSDN上了)
图2
图3
图4
下面是通过ADO来连接数据库的部分
代码在 http://download.csdn.net/download/wangchao712217/10147600
//构造、析构函数来创建ADO ACtivex控件XhDBInterface::XhDBInterface(void){ if (CoInitialize(NULL) == S_OK) m_bCOMInt = true; else m_bCOMInt = false; m_bConnDB = false; m_nDBType = Oracle; m_pConnection = NULL; m_strIP = _T(""); m_strPort = _T("0"); m_strUID = _T(""); m_strPWD = _T(""); m_nError = ERR_DB_NOERROR; //获取时间点 SYSTEMTIME st; ::GetLocalTime(&st); m_strLogName.Format("DBsys(%d%02d).log",st.wYear,st.wMonth);}XhDBInterface::~XhDBInterface(void){ m_strUID = ""; m_strPWD = ""; m_bConnDB = FALSE; try { if (m_pConnection != NULL) { if(m_pConnection->State != adStateClosed) m_pConnection->Close(); } } catch (_com_error e) { TRACE("关闭连接对象失败!:%s", e.ErrorMessage()); } CoUninitialize();}//连接函数里面有通过注册表的方式来创建ODBC数据源DNSint XhDBInterface::ConnectionDB(stConnDBInfo stConnInfo){ //打印调试日志参数获取 int bPDebug = 0; CString strDebugNodeVal; strDebugNodeVal = _T("0"); bPDebug = PrintDebugLog(_T("DBDebugLog.xml"),_T("ConnectionDB"),strDebugNodeVal); //打印调试日志 if (bPDebug == 1 && strDebugNodeVal == "1") { CString strDebug,strLogName; strLogName = _T("ConnectionDB.log"); WriteLog((LPCTSTR)strLogName,_T("===================================BEGIN====================================")); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][数据库类型][%d]"),stConnInfo.nDBType); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][数据库][%s]"),stConnInfo.strDBName); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][数据库IP][%s]"),stConnInfo.strHostName); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][端口号][%d]"),stConnInfo.nPort); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][用户名][%s]"),stConnInfo.strUserName); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][密码][%s]"),stConnInfo.strPassword); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][TNS服务名称][%s]"),stConnInfo.strTNSSN); WriteLog((LPCTSTR)strLogName,strDebug); strDebug.Format(_T("[参数][服务器服务名称][%s]"),stConnInfo.strServerName); WriteLog((LPCTSTR)strLogName,strDebug); WriteLog((LPCTSTR)strLogName,_T("")); } m_nDBType = stConnInfo.nDBType; if (m_nDBType == Oracle) { CreateTNSNamesOra(stConnInfo); } int bCDSN = 0; //建DSN bCDSN = CreateDBSourceName(stConnInfo); if (!bCDSN) { m_bConnDB = false; m_nError = ERR_DB_DISCONNECT; return 0; } CoInitialize(NULL); //连数据库 if(m_pConnection != NULL) { CString strErr; strErr.Format(_T("[ConnectionDB]数据库已连接")); WriteLog((LPCTSTR)m_strLogName,strErr); m_nError = ERR_DB_CONNECTED; return 0; } try { HRESULT hr; hr = m_pConnection.CreateInstance(__uuidof(Connection));//"ADODB.Connection" if(SUCCEEDED(hr)) { m_pConnection->ConnectionTimeout = 10; m_strDBName.Format(_T("%s"),stConnInfo.strDBName); m_strIP.Format(_T("%s"),stConnInfo.strHostName); m_strPort.Format(_T("%d"),stConnInfo.nPort); m_strUID.Format(_T("%s"),stConnInfo.strUserName); m_strPWD.Format(_T("%s"),stConnInfo.strPassword); CString strConnString(""); strConnString.Format(_T("DSN=%s; Charset=gb2312"),m_strDBName); m_pConnection->CursorLocation = adUseClient; //游标类型 hr = m_pConnection->Open(_bstr_t(strConnString), (_bstr_t)m_strUID, (_bstr_t)m_strPWD,adConnectUnspecified); if (SUCCEEDED(hr)) { m_nError = ERR_DB_SUCCESS; m_bConnDB = true; } else { m_nError = ERR_DB_CONNECT_FAILED; m_bConnDB = false; } } else { CString strErr; strErr.Format(_T("[ConnectionDB][ADO_ERR]建立连接失败!")); WriteLog((LPCTSTR)m_strLogName,strErr); m_nError = ERR_DB_CREATEADO_FAILED; m_bConnDB = false; } } catch(_com_error e) { TRACE("连接数据库失败!:%s", e.ErrorMessage()); CString strErr; strErr.Format(_T("[ConnectionDB]连接数据库失败!:%s[%u]%s"), e.ErrorMessage(),e.Error(),(char*)e.Description()); WriteLog((LPCTSTR)m_strLogName,strErr); m_pConnection = NULL; m_nError = ERR_DB_CODE_ERR; m_bConnDB = false; return 0; } if (m_bConnDB) { return 1; } else { return 0; }}//建立tnsint XhDBInterface::CreateTNSNamesOra(stConnDBInfo stConnInfo){ BOOL retcode = FALSE; CRegistry m_CReg; //通过操作系统位数求键位置 CString strKey(""),strKey1(""); if (IsWow64()) { //64位操作系统 strKey = _T("SOFTWARE\\Wow6432Node\\ORACLE"); } else { //32们操作系统 strKey = _T("SOFTWARE\\ORACLE"); } retcode = m_CReg.SetRootKey(HKEY_LOCAL_MACHINE); retcode = m_CReg.SetKey(strKey + _T("\\KEY_OraClient11g_home1"),FALSE); if(!retcode) { WriteLog((LPCTSTR)m_strLogName,_T("创建TNSNames失败,未安装:Oracle_11gR2_Client软件")); return retcode; } CString strOrgPath(""); strOrgPath = m_CReg.ReadString(_T("ORACLE_HOME"),_T("")); if (strOrgPath == "") { retcode = FALSE; WriteLog((LPCTSTR)m_strLogName,_T("创建TNSNames失败,未安装:Oracle_11gR2_Client软件")); return retcode; } else { strOrgPath += _T("\\Network\\Admin\\tnsnames.ora"); } //分析文件 CFileOperator cFileOP; vector<CString> vecLines; BOOL bFind = FALSE; cFileOP.ReadTNSNamesOraData(strOrgPath.GetBuffer(strOrgPath.GetLength()),vecLines); CString strTns(""),strService(""); strTns.Format(_T("%s"),stConnInfo.strTNSSN); strTns.Trim(); strService.Format(_T("%s"),stConnInfo.strServerName); strService.Trim(); for (int i=0;i<vecLines.size();i++) { stTNSNameOra stInfo; cFileOP.ParseTNSNamesData(vecLines[i],stInfo); if (stInfo.strTNSSN == strTns) { if (stInfo.strHost == stConnInfo.strHostName && stInfo.nPort == stConnInfo.nPort) { bFind = TRUE; } else { vecLines.erase(vecLines.begin()+i); } break; } } //更改配置 if (!bFind && strTns != "") { CString strTNS(""); strTNS.Format(_T("%s =\r\n (DESCRIPTION =\r\n (ADDRESS_LIST =\r\n (ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %d))\r\n )\r\n"),strTns,stConnInfo.strHostName,stConnInfo.nPort); strTNS.Format(strTNS + _T(" (CONNECT_DATA =\r\n (SERVER = DEDICATED)\r\n (SERVICE_NAME = %s)\r\n )\r\n )"),strService); vecLines.push_back(strTNS); retcode = cFileOP.WriteTNSNamesOraData(strOrgPath.GetBuffer(strOrgPath.GetLength()),vecLines); } //初始化键 if (!retcode) { WriteLog((LPCTSTR)m_strLogName,_T("创建TNSNames失败")); return retcode; } return retcode;}//建立DNSint XhDBInterface::CreateDBSourceName(stConnDBInfo stConnInfo){ int nRval = 1; switch (m_nDBType) { case Oracle: { stNormalDSN stDSNInfo; strcpy(stDSNInfo.strName,stConnInfo.strDBName); strcpy(stDSNInfo.strIP,stConnInfo.strHostName); stDSNInfo.nPort = stConnInfo.nPort; strcpy(stDSNInfo.strUID,stConnInfo.strUserName); strcpy(stDSNInfo.strPwd,stConnInfo.strPassword); CString strTns(""); strTns.Format(_T("%s"),stConnInfo.strTNSSN); strTns.Trim(); nRval = CreateOracleDBSourceName(stDSNInfo,strTns); } break; default: { //默认访问Oracle数据库 m_nDBType = Oracle; stNormalDSN stDSNInfo; strcpy(stDSNInfo.strName,stConnInfo.strDBName); strcpy(stDSNInfo.strIP,stConnInfo.strHostName); stDSNInfo.nPort = stConnInfo.nPort; strcpy(stDSNInfo.strUID,stConnInfo.strUserName); strcpy(stDSNInfo.strPwd,stConnInfo.strPassword); CString strTns(""); strTns.Format(_T("%s"),stConnInfo.strTNSSN); strTns.Trim(); nRval = CreateOracleDBSourceName(stDSNInfo,strTns); } break; } return nRval;}
增删查改 就不在这介绍了
阅读全文
0 0
- C++ ADO方式连接oracle数据库
- ADO方式连接数据库
- C++通过ADO方式连接Oracle数据库总结
- C++ODBC和ADO方式连接SQL数据库
- ObjectArx ADO方式连接数据库
- VC ADO连接Oracle数据库
- 使用ADO连接Oracle数据库
- ADO 连接数据库的几种方式
- MFC以ADO方式连接SQL数据库
- C++ ADO方式连接mysql数据库
- VC++6.0 通过ADO连接Oracle数据库
- MFC通过ADO连接Oracle数据库
- VC++用ADO连接Oracle数据库
- C++ 通过ADO连接Oracle数据库
- C#连接Oracle数据库
- ADO.NET 连接方式和非链接方式访问数据库
- Oracle数据库oci连接方式
- oracle数据库的连接方式
- 【LeetCode】330. Patching Array
- 3句代码,搞定动态添加行
- Paxos算法学习问题汇总
- 1055. 集体照 (25)
- 《Flask Web开发》读书笔记(2)第2章程序的基本结构(关键词:Web开发/Flask)
- C++ ADO方式连接oracle数据库
- hbase基础知识
- 写C++代码遇到的一个问题,错误已经在代码中注释了
- 卸载angular/cli(windows)
- 面试
- 第十周 项目二
- 码一码觉得不错的文章们
- python selenium api 源码查看方法
- Java基础学习——数组初识(1)