在StdAfx.h文件中,#endif // _AFX_NO_AFXCMN_SUPPORT之前,加入: #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF") 接着, 在My.cpp文件InitInstance方法中, AfxEnableControlContainer();之前,加入: if(!AfxOleInit()) //初始化 { AfxMessageBox( " initialize false!" ); } 我定了一个类,方便使用:
// ADODB.h class CADODB ... { public : _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; _CommandPtr m_pCommand; BOOL bOpenDB; CString m_strSQL; CADODB(); void ADOConnection(); // 打开连接数据库 void ADOClose(); // 关闭断开数据库 BOOL ADOUpdata(CString strCommand); // 更新操作,新建,删除,修改 _RecordsetPtr ADOSelect(CString strCommand); // 返回查询结果集 } ; extern CADODB ADOCtrl;
// ADODB.cpp CADODB ADOCtrl; CADODB::CADODB()... { bOpenDB = FALSE; } void CADODB::ADOConnection() ... { CHAR DBfilePath[MAX_PATH]; CString m_strdir; m_pConnection.CreateInstance( " ADODB.Connection " ); m_pRecordset.CreateInstance( " ADODB.Recordset " ); m_pCommand.CreateInstance( " ADODB.Command " ); GetCurrentDirectory(MAX_PATH,DBfilePath); m_strdir.Format( " %s/config.udl " ,DBfilePath); /这里使用.udl连接文件, 我是udl,mdb,exe都放在同一目录下 strtemp.Format( " File Name=%s " ,m_strdir); m_pConnection -> ConnectionString = (_bstr_t)strtemp; /注意使用时,数据类型变换 m_pConnection -> Open( "" , "" , "" ,NULL); m_pCommand -> ActiveConnection = m_pConnection; bOpenDB = TRUE; } void CADODB::ADOClose() ... { if (bOpenDB) ... { m_pConnection -> Close(); m_pConnection.Release(); m_pRecordset.Release(); m_pCommand.Release(); } } BOOL CADODB::ADOUpdata(CString strCommand)... { if ( ! bOpenDB) ... { return FALSE; } m_pCommand-> CommandText = (_bstr_t)strCommand; m_pCommand -> Execute(NULL,NULL,adCmdText); // 执行操作 return TRUE; } _RecordsetPtr CADODB::ADOSelect(CString strCommand)... { if ( ! bOpenDB) ... { return NULL; } m_pCommand-> CommandText = (_bstr_t)strCommand; return m_pCommand -> Execute(NULL,NULL,adCmdText); }
使用举例:
ADOCtrl.m_strSQL.Format( " SELECT * FROM MyTable " ); // SQL语句 ADOCtrl.ADOConnection(); ADOCtrl.m_pRecordset = ADOCtrl.ADOSelect(ADOCtrl.m_strSQL); while ( ! ADOCtrl.m_pRecordset -> adoEOF ) ... { // 获取字段信息, 注意字符类型变换: CString <-> CHAR* <-> _bstr_t CString str = (CHAR * )(_bstr_t)ADOCtrl.m_pRecordset -> GetCollect( " NAME " ); ADOCtrl.m_pRecordset -> MoveNext(); } ADOCtrl.ADOClose(); ADOCtrl.m_strSQL.Format(" INSERT INTO MyTable(NAME,AGE) VALUES ('%s','%d') " ,myname,age);
// SQL语句 ADOCtrl.ADOConnection(); ADOCtrl.ADOUpdata(ADOCtrl.m_strSQL); // 插入一条记录 ADOCtrl.ADOClose();
PS: // Get the max ID value; ADOCtrl.m_strSQL.Format("SELECT MAX(ID) as mID FROM GeneralTable"); ADOCtrl.m_pRecordset = ADOCtrl.ADOSelect(ADOCtrl.m_strSQL); _variant_t mmID = ADOCtrl.m_pRecordset->GetCollect("mID"); int newID = ++mmID.intVal; //将_variant_t的数据类型变成整型
关于.udl的使用: 1."提供程序"->选择:Microsoft Jet 4.0 OLE DB Provider; 2."连接"->输入数据库名称(可直接写数据库名, 不要加地址);登录信息不动; 3."所有"->Data Source 的值为 数据库名全称