ObjectARX中ADO操作数据库的一个类实例封装
//定义一个CAdoDb.h的C++Ado的操作的一个类实例定义 #pragma once // #include "CAdoDb.h" #include "stdafx.h" #include "Convert.h" #ifndef _CAdoDb_H_ #define _CAdoDb_H_ enum EnumAdoDbType { DbAccess=0, DbSQLServer=1, DbOracle=2, }; class CAdoDb { public: CAdoDb(void); ~CAdoDb(void); void LoadCOM(void);//初始化COM void UnLoadCOM(void);//释放COM // Convert cvt; //获取一个连接对象 _ConnectionPtr ConnPtr; _ConnectionPtr GetConnection(); _CommandPtr GetCommand(); //连接字符串 _bstr_t ConnectionString; //设置连接信息 EnumAdoDbType enumDbType; void SetConnStr_mdb(_bstr_t mdbpath,_bstr_t userid,_bstr_t password); void SetConnStr_sql(_bstr_t Data_Source,_bstr_t Initial_Catalog,_bstr_t userid,_bstr_t password); _bstr_t ErrorMessage; //打开连接 bool Open(); //获取表数据 _RecordsetPtr Execute(_bstr_t sql); //执行一个数据库操作select,update,insert,delete,//... BOOL ExecuteNonQuery(_bstr_t sql); BOOL ExecuteNonQuery(_bstr_t sql,_ConnectionPtr conptr); //获取当前行中字段内容 char* GetFieldValue(_RecordsetPtr rs,char* fieldName); wchar_t* GetFieldValueW(_RecordsetPtr rs,char* fieldName); //关闭Ado连接 void Dispose(void); }; #endif
//CAdoDb.cpp是对CAdoDb.h头文件类成员的实现 #pragma once #include "stdafx.h" // #include "Convert.h" #include "CAdoDb.h" using namespace std; CAdoDb::CAdoDb(void) { } CAdoDb::~CAdoDb(void) { } void CAdoDb::LoadCOM(void) { CoInitialize(NULL); //初始化COM,必须的 } void CAdoDb::UnLoadCOM(void) { CoUninitialize(); //释放COM } //获取一个连接对象 _ConnectionPtr CAdoDb::GetConnection() { _ConnectionPtr m_pConnection; //创建智能指针,必须的 //m_pConnection.CreateInstance(__uuidof(Connection)); //或 m_pConnection.CreateInstance("ADODB.Connection"); return m_pConnection; } _CommandPtr CAdoDb::GetCommand() { _CommandPtr m_pCommand; m_pCommand.CreateInstance(_uuidof(Command)); return m_pCommand; } void CAdoDb::SetConnStr_mdb(_bstr_t mdbpath,_bstr_t userid,_bstr_t password) { _bstr_t constr; //this->enumDbType=DbAccess; //mdb数据库连接字符串 //_bstr_t mdbpath="d:\\test.mdb"; //char* userid="Admin"; //char* password=""; constr="Provider=Microsoft.Jet.OLEDB.4.0;"; constr += "Data Source=" + mdbpath + ";"; constr += "user id="+userid+";"; constr += "password="+password+";"; constr += "Persist Security Info=True;"; ConnectionString=constr; } void CAdoDb::SetConnStr_sql(_bstr_t Data_Source,_bstr_t Initial_Catalog,_bstr_t userid,_bstr_t password) { _bstr_t constr; //this->enumDbType=DbSQLServer; constr="Provider=SQLOLEDB.1;Password="+password+";"; constr+="Persist Security Info=True;"; constr+="User ID="+userid+";"; constr+="Initial Catalog="+Initial_Catalog+";"; constr+="Data Source="+Data_Source+""; this->ConnectionString=constr; } //打开连接 bool CAdoDb::Open() { bool rbc=false; try { _bstr_t constr=this->ConnectionString; this->ConnPtr=this->GetConnection(); this->ConnPtr->ConnectionString=constr; this->ConnPtr->Open(constr,"","",adConnectUnspecified); rbc=true; } catch(_com_error &e) { rbc=false; //cout<<"数据库初始化错误! "<<endl; //const TCHAR *msg; //msg=e.ErrorMessage();//_T("Error Description="); //cout<<"ErrorMessage="<<msg<<endl; //_bstr_t errmsg=new _bstr_t(msg); //errmsg=L"数据库初始化错误!"+errmsg; this->ErrorMessage="数据库初始化错误!"; } return rbc; } //获取一个记录集 _RecordsetPtr CAdoDb::Execute(_bstr_t sql) { _RecordsetPtr pRst(__uuidof(Recordset)); _variant_t RecordsAffected; pRst=this->ConnPtr->Execute(sql,&RecordsAffected,adCmdText);//使用Execute方法,student为表名 return pRst; } BOOL CAdoDb::ExecuteNonQuery(_bstr_t sql) { return ExecuteNonQuery(sql,this->ConnPtr); } BOOL CAdoDb::ExecuteNonQuery(_bstr_t sql,_ConnectionPtr conptr) { try { _variant_t vNULL; vNULL.vt = VT_ERROR; ///定义为无参数 vNULL.scode = DISP_E_PARAMNOTFOUND; // _RecordsetPtr m_pRecordset(__uuidof(Recordset)); _CommandPtr m_pCommand=this->GetCommand(); m_pCommand->ActiveConnection=conptr; m_pCommand->CommandText=sql; m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText); } catch(_com_error &e) { return FALSE; } return TRUE; } //获取当前行中字段内容 char* CAdoDb::GetFieldValue(_RecordsetPtr rs,char* fieldName) { char* line; _variant_t var; string strName; //初始化 //line=NULL; // var = rs->GetCollect(fieldName); //var =rs->GetFields()->GetItem("STDName")->GetValue(); if(var.vt != VT_NULL) { strName = (LPCSTR)_bstr_t(var); line=(char *)strName.c_str(); } return line; } wchar_t* CAdoDb::GetFieldValueW(_RecordsetPtr rs,char* fieldName) { wchar_t* tmp; char* tmpcharPtr=GetFieldValue(rs,fieldName); // _bstr_t bstrt=cvt.Get_bstr_t(tmpcharPtr); tmp=cvt.GetWchar_t(bstrt); return tmp; } //关闭Ado连接 void CAdoDb::Dispose(void) { if(this->ConnPtr) { this->ConnPtr->Close(); //Release //this->ConnPtr->Release(); } }