先决条件
1.客户端一定要安装 Oracle的oledb的驱动。可到以下网址下载(10.版本的大概190M)
http://otn.oracle.com/software/tech/windows/ole_db/content.html
2.要使用Net Configuration Assistant配置好侦听及相关环境
代码
首先,在 stdafx.h 中加入以下代码,导入ado库
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
其次,要确保有 ::CoInitialize(NULL)的调用,以初始化COM.
//类定义
class CDBOp
{
public:
bool ReConnect();
bool CloseConnect();
bool OpenConnect(int dbType, 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; //保存错误信息
};
//类实现
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(int dBType,
CString hostName,
CString dBName,
CString userName,
CString password)
{
CString strConn;
if (dBType =0) //Sql server
{
strConn = "Provider=SQLOLEDB.1";
strConn+= ";User ID=";
strConn+= userName;
strConn+= ";Password=";
strConn+= password;
strConn+= ";Initial Catalog=";
strConn+= dBName;
strConn+= ";Data Source=";
strConn+= hostName;
}
else if (dBType =1) //Oracle
{
//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("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("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;
}
}