<转>vc 用ado访问Oracle数据库的代码示例

#pragma once



class CDBOp  

{

public:

	bool ReConnect();

	bool CloseConnect();

	bool OpenConnect(CString hostName, CString dBName, CString userName, CString password);

	bool GetItemData(CString itemID, float &price, CString &descript);  //取存储过程数据,这里只是举例说明

	CString GetErrorMsg();

	CDBOp();

	virtual ~CDBOp();

private:

	_ConnectionPtr m_pConnection;  //连接对象

	_RecordsetPtr m_pRecordset;     //记录集对象

	bool   m_bConnectSuccess;     //连接是否成功

	CString   m_strConnString;      //数据库连接字符串 

	CString   m_strErrMsg;           //保存错误信息

};









#include "StdAfx.h"

#include "DBOp.h"



//类实现





CDBOp::CDBOp():m_bConnectSuccess(false)

{

	::CoInitialize(NULL);

	m_pConnection.CreateInstance("ADODB.Connection");

	m_pConnection->ConnectionTimeout=30; 

	m_pRecordset.CreateInstance("ADODB.Recordset");

}

CDBOp::~CDBOp()

{

	//::CoUninitialize();

	CloseConnect();

}

//打开连接(数据库类型,主机名,数据库名,登陆名,密码)

//数据库类型: 0 为Sql server, 1为 Oracle

bool CDBOp::OpenConnect(

						CString hostName, 

						CString dBName, 

						CString userName, 

						CString password)        

{

	CString strConn;



	//MSDAORA or OraOLEDB.Oracle.1

	strConn = "Provider=OraOLEDB.Oracle.1";

	strConn+= ";Persist Security Info=true";

	strConn+= ";User ID=";

	strConn+= userName;

	strConn+= ";Password=";

	strConn+= password;

	strConn+= ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)";

	strConn+= "(HOST=";

	strConn+= hostName;

	strConn+= ")(PORT=1521))(CONNECT_DATA=";

	strConn+= "(SERVICE_NAME=";

	strConn+= dBName;

	strConn+= ")))";





	if (strConn.IsEmpty()) 

	{

		m_strErrMsg="The connect string is null.";

		return false;

	}

	CloseConnect();

	m_strConnString =strConn; 



	return ReConnect();

}

//再次连接

bool CDBOp::ReConnect()

{

	m_strErrMsg=_T("");

	m_bConnectSuccess= false;

	HRESULT hr;

	try

	{

		hr = m_pConnection->Open(_bstr_t(m_strConnString), "", "", adModeUnknown);

		if (SUCCEEDED(hr))

			m_bConnectSuccess=true;  

	}

	catch(_com_error e)

	{  

		m_strErrMsg.Format(_T("Connect database failure!\r\n\r\n message error:%s\r\n\r\n The connect string:%s"),e.ErrorMessage(),m_strConnString); 

	}

	return m_bConnectSuccess;

}

//关闭链接

bool CDBOp::CloseConnect()

{

	if (m_bConnectSuccess)

	{

		if (m_pConnection->State==1) 

			m_pConnection->Close(); 

		m_bConnectSuccess =false;

	}

	return true;

}

//取得错误信息

CString CDBOp::GetErrorMsg()

{

	return m_strErrMsg;

}



bool CDBOp::GetItemData(CString itemID, float &price, CString &descript)

{

	_CommandPtr   pCommand = NULL;

	pCommand.CreateInstance("ADODB.Command");

#ifdef   _DEBUG   

	if   (pCommand   ==   NULL)   

	{   

		AfxMessageBox(_T("Command Created fail! Please confirm whether initialize COM."));   

	}   

#endif   

	ASSERT(pCommand   !=   NULL);  

	try   

	{   

		if (m_bConnectSuccess==false)

		{

			if (ReConnect()==false) 

				return false;

		}

		//输入参数   itemID    

		_ParameterPtr   pParamItemID;   

		pParamItemID.CreateInstance("ADODB.Parameter");   

		pParamItemID->Name="ItemID";   //所用存储过程参数名称   

		pParamItemID->Type=adChar;    //参数类型   

		pParamItemID->Size=10;     //参数大小   

		pParamItemID->Direction=adParamInput;  //表明是输入参数   

		pParamItemID->Value=_variant_t(itemID);   

		pCommand->Parameters->Append(pParamItemID);    





		//输出参数   price    

		_ParameterPtr   pParamPrice;       

		pParamPrice.CreateInstance("ADODB.Parameter");   

		pParamPrice->Name="Price";    //参数名称   

		pParamPrice->Type=adNumeric;    //参数类型   

		pParamPrice->Size=9;      //参数大小

		pParamPrice->Precision =9;

		pParamPrice->NumericScale =2;  

		pParamPrice->Direction=adParamOutput;  //声明是输出参数   

		pCommand->Parameters->Append(pParamPrice);  



		//输出参数   Descript    

		_ParameterPtr   pParamDescript;       

		pParamDescript.CreateInstance("ADODB.Parameter");   

		pParamDescript->Name="Descript";   //参数名称   

		pParamDescript->Type=adVarChar;    //参数类型   

		pParamDescript->Size=160;     //参数大小

		pParamDescript->Direction=adParamOutput; //声明是输出参数   

		pCommand->Parameters->Append(pParamDescript);  

		//执行存储过程   

		pCommand->ActiveConnection=m_pConnection;   

		pCommand->CommandText="spItemInfo";   //存储过程名称   

		pCommand->CommandType=adCmdStoredProc;  //表示为存储过程adCmdStoredProc   

		pCommand->Execute(NULL,   NULL,   adCmdStoredProc);   





		price=(float)(pParamPrice->Value);

		descript = (char*)_bstr_t(pParamDescript->Value);  

		return true;

	}

	catch(_com_error   e)   

	{         

		m_strErrMsg.Format(_T("Error:GetItemData. Reason:%s\n file: %s; line: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);       

		return false;

	}   



}

  转自http://www.cnblogs.com/finema/archive/2008/08/22/1273478.html

你可能感兴趣的:(oracle数据库)