C++连接Oracle之ADO
来源:互联网 发布:linux 打开控制台 编辑:程序博客网 时间:2024/06/06 09:34
最近因为项目的需要,要将一些获取到的数据存入Oracle数据库中,可能以前接触的数据库这一块比较少,没有在项目中使用过,所以就查找一些资料,将这几天的成果做一下记录。
环境:windows7 64bit
IDE :VS 2010
服务端:winserver2008 Oracle 12c
ADO连接(微软的)
两种连接Oracle方法:
OCCI连接(Oracle自己的)
说明:我都是采用客户端连接的方式,即数据库部署在数据库服务器上,我在另一台机器上作为客户端调试程序访问数据库。
本节先说ADO连接,OCCI方式在下一节讨论,ADO接口是微软开发并提供的,目的是简化对程序的工作,方便程序员开发,对底层的数据库操作API进行封装,ADO的易用性很高,这也是为什么现在很多教程都用ADO来讲解数据库的应用了。不过,换个角度想,ADO的效率相对来讲就比较低了。
首先我要利用已有的客户端工具SQL Developer验证,数据库是否可用。
填入必要的连接名,用户名,口令,主机名,端口,SID等信息后,点测试,显示成功。
源码部分参考了http://blog.chinaunix.net/uid-26790551-id-3193999.html的内容
stdafx.h:
//stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件// #pragma once//#include"targetver.h"#include <stdio.h>#include <tchar.h>//TODO: 在此处引用程序需要的其他头文件
DBOperation.h:
#pragma once #import "C:\ProgramFiles\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") class CDBOperation{public: //初始化数据库操作需要的对象 CDBOperation(void); ~CDBOperation(void); //连接至数据库 boolConnToDB(char *ConnectionString,char *UserID, char*Password); //数据库操作函数 //查询操作删除以及添加 _RecordsetPtr ExecuteWithResSQL(constchar *); //boolExecuteNoResSQL(const char *);//delete and add private: voidPrintErrorInfo(_com_error &); private: //初始化数据库连接、命令、记录集 _ConnectionPtr CreateConnPtr(); _CommandPtr CreateCommPtr(); _RecordsetPtr CreateRecsetPtr(); private: //数据库连接需要的连接、命令操作对象 _ConnectionPtr m_pConnection; _CommandPtr m_pCommand;};
DBOperation.cpp
#include "stdafx.h"#include "DBOperation.h" CDBOperation::CDBOperation(void){ CoInitialize(NULL); m_pConnection = CreateConnPtr(); m_pCommand = CreateCommPtr();} CDBOperation::~CDBOperation(void){ //m_pCommand->Close(); m_pConnection->Close();} bool CDBOperation::ConnToDB(char*ConnectionString,char *UserID, char *Password){ if (NULL ==m_pConnection) { printf("Failedto create connection\n"); return false; } try { HRESULT hr =m_pConnection->Open(ConnectionString, UserID, Password, NULL); if (TRUE== FAILED(hr)) { returnfalse; } m_pCommand->ActiveConnection =m_pConnection; return true; } catch(_com_error &e) { PrintErrorInfo(e); return false; }} _RecordsetPtrCDBOperation::ExecuteWithResSQL(constchar *sql){ //已经在连接至数据库的时候进行判断了 //if (NULL ==m_pCommand || 0 == m_pConnection->State) //{ // printf("Failed to create command ORthe state of connection is zero\n"); // return NULL; //} //char *query =new char; //strcpy(query,sql); try { m_pCommand->CommandText =_bstr_t(sql); _RecordsetPtr pRst =m_pCommand->Execute(NULL, NULL, adCmdText); returnpRst; //_variant_tra; //_RecordsetPtrpRst = m_pConnection->Execute((_bstr_t)query, &ra, adCmdText); } catch(_com_error &e) { PrintErrorInfo(e); returnNULL; }} //boolCDBOperation::ExecuteNoResSQL(const char *sql)//{// //if (NULL == m_pCommand || 0 ==m_pConnection->State)// //{// // printf();// //}// try// {// char *query = NULL;// strcpy(query, sql);// m_pCommand->CommandText =(_bstr_t)query;//// }//} void CDBOperation::PrintErrorInfo(_com_error &e){ printf("Errorinfomation are as follows\n"); printf("ErrorNo:%d\nError Message:%s\nError Source:%s\nError Description:%s\n",e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());} _ConnectionPtrCDBOperation::CreateConnPtr(){ HRESULT hr; _ConnectionPtr connPtr; hr = connPtr.CreateInstance(__uuidof(Connection)); if(FAILED(hr) == TRUE) { returnNULL; } returnconnPtr;} _CommandPtrCDBOperation::CreateCommPtr(){ HRESULT hr; _CommandPtr commPtr; hr = commPtr.CreateInstance(__uuidof(Command)); if(FAILED(hr) == TRUE) { returnNULL; } returncommPtr;} _RecordsetPtrCDBOperation::CreateRecsetPtr(){ HRESULT hr; _RecordsetPtr recsetPtr; hr = recsetPtr.CreateInstance(__uuidof(Command)); if(FAILED(hr) == TRUE) { returnNULL; } returnrecsetPtr;}
main.cpp
#include "DBOperation.h"#include <iostream>using namespace std; void main(){ CDBOperation dbOper; bool bConn=dbOper.ConnToDB("Provider=OraOLEDB.Oracle;Password = abc;Persist Security Info=True;User ID=COMPETITION;DataSource=\"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.26.51)(PORT = 1521)) )(CONNECT_DATA = (SID =RESOURCECENT)))\"","COMPETITION","123"); if (false == bConn) { printf("连接数据库出现错误\n"); system("PAUSE"); return; } printf("连接数据库成功!\n"); _RecordsetPtr pRst; //执行查询语句 //char *sql ="select * from TSTUDENT"; charsql[255] = { 0 }; strcpy_s(sql, "select* from TABLETEST"); pRst = dbOper.ExecuteWithResSQL(sql); if (NULL ==pRst) { printf("查询数据出现错误!\n"); system("PAUSE"); return; } if(pRst->adoEOF) { pRst->Close(); printf("Thereis no records in this table\n"); system("PAUSE"); return; } printf("正在查询...\n"); _variant_t vSno, vName, vAge, vDno, vDname,vCname; while(!pRst->adoEOF) { //pRst->MoveFirst();//记录集指针移动到查询结果集的前面 vSno = pRst->GetCollect(_variant_t((long)0)); vName = pRst->GetCollect(_variant_t("name")); vDname = pRst->GetCollect(_variant_t("sex")); vAge = pRst->GetCollect(_variant_t("age")); //vDno =pRst->GetCollect("dno"); //vDname =pRst->GetCollect("dname"); //vCname =pRst->GetCollect("cname"); printf("%s\t%s\t%s\t%d\n",(LPSTR)(LPCSTR)(_bstr_t)vSno, (LPSTR)(LPCSTR)_bstr_t(vName),(LPSTR)(LPCSTR)_bstr_t(vDname), vAge.intVal); pRst->MoveNext(); } //执行插入语句 strcpy_s(sql, "insertinto TABLETEST(sno, name, sex, age) values('20080004', '阿里巴巴', '男', 32)"); pRst = dbOper.ExecuteWithResSQL(sql); if (NULL !=pRst) { printf("插入数据成功\n"); } //执行删除语句 sprintf_s(sql, "deletefrom TABLETEST where sno = '%s'","20080002"); pRst = dbOper.ExecuteWithResSQL(sql); if (NULL !=pRst) { printf("删除数据成功\n"); } system("PAUSE"); //pRst->Close();}
完成后编译运行总是报错:
网上查资料后,看到有人遇到类似的问题,
然后x64编译,通过运行,成功。
错误异常:
1. 调试正常的程序,不知道系统环境那里做了修改,过几天运行又报错。
ADO连接数据库运行x64,编译报错
OraOLEDBpus12.dll:找不到指定模块(配图是网上找的)
在Oracle安装目录找到F:\app\Oracle\product\12.1.0\dbhome_1\BIN
OraOLEDBpus12.dll文件放入C:\Windows\System32目录
这时,新的错误又出现了OraOLEDB12us.dll
解决: 同上,把OraOLEDB12us.dll 拷到系统盘:\Windows\system32\
2. 程序调试完毕,换到其他人的电脑运行程序,有的机器正常,有的会运行报错0xc000007b:
查找是缺少部分.dll库支持,使用DirectX Repair工具。
修复后,重启电脑,程序可运行。
- C++连接Oracle之ADO
- Dephi ADO连接Oracle之怪情况
- ADO连接Oracle
- Oracle ADO的连接
- ado.net连接oracle
- ADO 连接 服务器Oracle
- VC连接Oracle数据库之ODBC及ADO
- ADO之连接数据库
- ado.net连接Oracle专题
- VC ADO连接Oracle数据库
- ado 连接 oracle DB_E_ERRORSINCOMMAND错误
- ado连接oracle报错
- 使用ADO连接Oracle数据库
- C#ADO.net连接池
- ORACLE ADO连接失败的修复
- VC++6.0 通过ADO连接Oracle数据库
- VC用ADO连接oracle的方法
- VC用ADO连接oracle的方法 .
- repo sync失败 remote: warning: suboptimal pack - out of memory
- ListView属性详解 参考2
- 深入理解Map与Set---用集成HashSet来实现Map
- MySQL数据库设置主从同步
- [iOS]AppStore最新上架流程梳理
- C++连接Oracle之ADO
- 安卓自定义View基础-坐标系
- Linux中#和%号在参数替换结构中的作用
- wpf 如何将参数通过CommandParameter 传入viewmodel
- Conversion to Dalvik format failed: Unable to execute dex:
- 安卓系统与API版本对应关系
- ListView属性详解 参考3
- 保存到本地的方法
- C++之system函数