#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