在VS环境下以ADO方式操作Oracle数据库

原创 2013年12月04日 11:46:50

利用ADO引擎方式访问Oracle数据库的实现方法:

定义数据库头文件为CDBOperation.h

#pragma once  
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","adoEOF"),rename("LockTypeEnum","AdoLockTypeEnum"),rename("DataTypeEnum","AdoDataTypeEnum"),\
rename("FieldAttributeEnum","AdoFieldAttributeEnum"),rename("EditModeEnum","AdoEditModeEnum"),rename("RecordStatusEnum","AdoRecordStatusEnum"),rename("ParameterDirectionEnum","AdoParameterDirectionEnum")
class CDBOperation  
{  
	public:  
		//构造对象方法 
		CDBOperation(void);  
		~CDBOperation(void);  
  
		//连接数据库  
		bool ConnToDB();  
  
		//数据库操作函数(增、删、改、查)   
		_RecordsetPtr ExecuteWithResSQL(CString);  
  
	private:  
		void PrintErrorInfo(_com_error &);  
  
	private:  
		//初始化数据库连接、命令、记录集  
		_ConnectionPtr CreateConnPtr();  
		_CommandPtr CreateCommPtr();  
		_RecordsetPtr CreateRecsetPtr();  
  
	private:  
		//数据库连接需要的连接、命令、记录集对象  
		_ConnectionPtr m_pConnection;  
		_CommandPtr m_pCommand; 
		_RecordsetPtr m_pRecordset;
};  

定义程序源文件CDBOperation.cpp

#include "CDBOperation.h"  

CDBOperation::CDBOperation(void)  
{  
    CoInitialize(NULL);  
    m_pConnection = CreateConnPtr();  
    m_pCommand = CreateCommPtr();
	m_pRecordset = CreateRecsetPtr();
}  
CDBOperation::~CDBOperation(void)  
{  
    m_pConnection->Close();  
}  
bool CDBOperation::ConnToDB()  
{  
    if (NULL == m_pConnection)  
    {  
        printf("Failed to create connection\n");  
        return false;  
    }  
    try  
    {  
		_bstr_t strConnect="Provider=OraOLEDB.Oracle;User ID=scott;Password=19900624;Persist Security Info=True;Data Source=\"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.108.85.137)(PORT = 1521)) )(CONNECT_DATA = (SID = ORCL)(SERVER=DEDICATED)))\"";
	    HRESULT hr=m_pConnection->Open(strConnect,"","",NULL);
        if (TRUE == FAILED(hr))  
        {  
            return false;  
        }  
        m_pCommand->ActiveConnection = m_pConnection;  
        return true;  
    }  
    catch(_com_error &e)  
    {  
        PrintErrorInfo(e);  
        return false;  
    }  
}  
_RecordsetPtr CDBOperation::ExecuteWithResSQL(const char *sql)  
{  
    try  
    {  
        m_pCommand->CommandText = _bstr_t(sql);  
        m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdText);  
        return m_pRecordset;  
    }  
    catch(_com_error &e)  
    {  
        PrintErrorInfo(e);  
        return NULL;  
    }  
}  
void CDBOperation::PrintErrorInfo(_com_error &e)  
{  
    printf("Error infomation 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());  
}  
  
_ConnectionPtr CDBOperation::CreateConnPtr()  
{  
    HRESULT hr;  
    _ConnectionPtr connPtr;  
    hr = connPtr.CreateInstance(__uuidof(Connection));  
    if (FAILED(hr) == TRUE)  
    {  
        return NULL;  
    }  
    return connPtr;  
}  
  
_CommandPtr CDBOperation::CreateCommPtr()  
{  
    HRESULT hr;  
    _CommandPtr commPtr;  
    hr = commPtr.CreateInstance(__uuidof(Command));  
    if (FAILED(hr) == TRUE)  
    {  
        return NULL;  
    }  
    return commPtr;  
}  
  
_RecordsetPtr CDBOperation::CreateRecsetPtr()  
{  
    HRESULT hr;  
    _RecordsetPtr recsetPtr;  
    hr = recsetPtr.CreateInstance(__uuidof(Recordset));  
    if (FAILED(hr) ==TRUE)  
    {  
        return NULL;  
    }  
    return recsetPtr;  
}  



Oracle数据库的实现main():

#include <afx.h>  
#include "CDBOperation.h"    
#include <iostream>  
#include <afxinet.h>  
#include <afxwin.h>  
using namespace std;
void main()  
{  
	CDBOperation dbObject;    
	CString sql;  
	bool bConn = dbObject.ConnToDB();    
	if (true == bConn)    
	{    
		//AfxMessageBox("connection success \0");  
		// ::MessageBox(NULL, "abc!",_T("attention"), MB_OKCANCEL  == IDOK);  
		// MessageBox(NULL,"连接数据库出现错误\0",0,0);    
		cout<<"数据库连接成功...."<<endl;  

	}    
	_RecordsetPtr pRst=NULL;  //创建一个数据集智能指针  
	pRst.CreateInstance(__uuidof(Recordset));//初始化Recordset指针  
	char type;  
	while(true)  
	{  
		cout<<"请输入指令(s、a、d、u):"<<endl;  
		cin>>type;  
		switch(type)  
		{  
		case 's':{  
			//查询    
			sql="select * from RECV_TABLE";  
			pRst = dbObject.ExecuteWithResSQL(sql);    
			if (NULL == pRst)    
			{    
				//MessageBox(NULL,_T("查询数据出现错误!\0"),0,0);    
				printf("查询数据出现错误!\n");
				break;   
			}    
			if (pRst->adoEOF)    
			{    
				pRst->Close();    
				//AfxMessageBox(_T("There is no records in this table\0"));  
				//MessageBox(NULL,"There is no records in this table\0",0,0);    
				printf("There is no records in this table...\n");
				break;    
			}    
			_variant_t vSno, vName;    
			if(!pRst->BOF)  
			{  
				pRst->MoveFirst();//记录集指针移动到查询结果集的前面    
			}  
			while (!pRst->adoEOF)    
			{    
				vSno = pRst->GetCollect(_variant_t("SID"));    
				vName = pRst->GetCollect(_variant_t("CONTENT"));    
				pRst->MoveNext();    
				if(vSno.vt != VT_NULL)    
				{    
					cout<<(LPCTSTR)(_bstr_t)vSno<<(LPCTSTR)(_bstr_t)vName<<endl;  
				}    
			}   
				 }  
				 break;  

		case 'a':{  
			CTime tm = CTime::GetCurrentTime();  
			CString str=tm.Format("%Y-%m-%d  %H-%M-%S");  
			char arr[]="任何问题都可以帮你解决";  
			char id[] = "S10011";  
			CString SID= id;  
			CString content = arr;  
			sql="insert into RECV_TABLE (SID,CONTENT,TIME) values ('"+SID+"','"+content+"',to_date('"+str+"','yyyy-mm-dd hh24:mi:ss'))";  
			pRst = dbObject.ExecuteWithResSQL(sql);    
			if (NULL != pRst)    
			{    
				//AfxMessageBox(_T("插入数据成功\n"));    
				printf("插入数据成功!\n");
				break;  
			}   
				 }  
				 break;  
		case 'd':{  
			//执行删除语句   
			//sprintf(sql, "delete  from RECV_TABLE where SID='%s', "S1003");   
			sql="delete  from RECV_TABLE where SID='S1004'";  
			pRst = dbObject.ExecuteWithResSQL(sql);    
			if (NULL != pRst)     
			{    
				MessageBox(NULL,_T("删除数据成功\0"),0,0);   
				break;  
			}   
				 }  
				 break;  
		case 'u':{  
			sql="update RECV_TABLE set CONTENT='cupt5634@126.com' where SID='S1003'";  
			pRst = dbObject.ExecuteWithResSQL(sql);    
			if (NULL != pRst)    
			{    
				//MessageBox(NULL,_T("更新数据成功\0"),0,0);  
				printf("更新数据成功!\n");
				break;  
			}   
				 }  
				 break;  
		}  
	}  

	system("PAUSE");  

}  






MFC中使用ADO访问Oracle

2014年3月26日17:28:15 MFC中使用ADO访问Oracle 通过执行SQL语句访问数据库。 _ConnectionPtr pConnection=NULL;//连接 _R...
  • seulww
  • seulww
  • 2014年03月26日 17:28
  • 5727

C++ ADO方式连接oracle数据库

在这里先做一个讲解ADO和ODBC的关系,及其调用关系。 ,及ADO调用的方式
  • wangchao712217
  • wangchao712217
  • 2017年12月06日 10:48
  • 107

VC使用ADO连接Oracle数据库详解(含源码下载)

ADO 主要对象介绍     ADO对象包括:连接对象(Connection Object)、命令对象 (Command Object) 、记录集对象(RecordSet  Object)、字段对...
  • risingsun001
  • risingsun001
  • 2012年05月20日 21:10
  • 5056

C++ 通过ADO连接Oracle数据库

背景 接触C++以来,因为之前学的java做Web时经常要和数据库打交道,所以也就一直想用C++来操作数据库。之前也听过ODBC数据源的方法听说比较麻烦,C++用ADO的方法连接数据比较方便。 下面就...
  • u013147600
  • u013147600
  • 2015年05月13日 10:06
  • 2703

32位程序如何使用ADO访问64位Oracle数据库[转]

原始链接 http://blog.csdn.net/HXC_HUANG/article/details/71773850
  • crybird
  • crybird
  • 2017年09月27日 18:23
  • 248

C++连接Oracle之ADO

最近因为项目的需要,要将一些获取到的数据存入Oracle数据库中,可能以前接触的数据库这一块比较少,没有在项目中使用过,所以就查找一些资料,将这几天的成果做一下记录。   环境:windows7 64...
  • u012139536
  • u012139536
  • 2016年06月13日 16:23
  • 5412

VS与MySQL通过ADO方式连接

1.下载好MySQL之后,安装开发员的版本,用命令行在数据库test下建立表st并插入了两条记录,然后OBDC添加用户、系统DSN 驱动程序是MySQL OBDC 5.3 ANSI Driver ...
  • BCD_not_CBD
  • BCD_not_CBD
  • 2015年08月29日 08:45
  • 787

C++在WINDOWS平台使用ADO连接数据库

 在WINDOWS平台,通过ADO连接数据库,应该是最标准的。但是由于使是通过COM技术实现的,问题就变得复杂了许多。 同时,也因为许多开源的编译器不支持或者不是很好地支持COM技术,给我们学习、开发...
  • cangwu_lee
  • cangwu_lee
  • 2008年01月03日 16:31
  • 1638

VS2010通过ADO链接SQL Server的方法体会

这里时我花了一天多的时间查找各种资料和网站上面整理出来的有关MFC通过ADO的方式连接SQL server数据库的方法,各种书籍或者网站都只说了其中的一些,只是举了一些成功的例子,因为不同人不同电脑的...
  • woshimalingyi
  • woshimalingyi
  • 2014年12月15日 02:21
  • 2948

64位程序,利用ADO连接Oracle数据库

刚好手头项目解决了ADO连接Oracle数据库的问题,z
  • sisyphus_zhou
  • sisyphus_zhou
  • 2014年09月29日 16:14
  • 6766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在VS环境下以ADO方式操作Oracle数据库
举报原因:
原因补充:

(最多只允许输入30个字)