MFC ADO数据库操作 - 延陵小明 - CSDN博客
内容比较乱,作为草稿,对现有的ado操作函数方法进行汇总。
小函数
m_pRecordset->RecordCount//取得记录数量
全局变量
#import "msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") _ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset; 1.连接数据源OnInitADOConn();//初始化OLE/COM库环境::CoInitialize(NULL);try{ //创建Connection对象m_pCOnnection.CreateInstance("ADODB.Connection");//设置连接字符串_bstr_t strConnect="uid=;pwd=;DRIVER={Microsoft Access Driver(*mdb)};DBQ=database.mdb;";m_pConnection->Open(strConnect,"","",adModeUnknown);}catch(_com_error e){ AfxMessageBox(e.Description);}
2.关闭数据库连接
if(m_pRecordset!=NULL) m_pRecordset->Close();m_pConnection->Close();::CoUninitialize();//释放环境
3.获取记录集数据
传入一个_bstr_t bstrSQL(1)Open方法try{ if(m_pConnection==NULL)//如果为空,重新连接 OnInitADOConn();m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);}//adCmdText:bstrSQL是文本.adCmdTable:bstrSQL是表名(2)Execute方法_RecordsetPtr Execute(_bstr_t CommandTex,VARIANT* RecordsAffeced,long Options)CommandText是SQL命令,RecordsAffeced是操作后影响的行数,Options是CommandText中内容的类型Options:adCmdText文本,adCmdTable表名,adCmdStoredProc存储过程,adCmdUnknown类型未知>>_variant_t RecordsAffected;try{ if(m_pConnection==NULL)//是否连接数据库 OnInitADOConn();//又重新连接 m_pConnection->Execute(bstrSQL,NULL,adCmdText);}catch(_com_error e){ e.Description();return false;}
4.遍历记录集
MoveNext,MoveFirst,MoveLast,MovePrevious;(char *)(_bstr_t)m_pRecordset->GetCollect("姓名");//方法一m_sName=(CStringW)(m_pAdoRecordset->Fields->Item[_variant_t("NAME")]->Value);//方法二while(m_pRecordset->adoEOF==0){m_pRecordset->MoveNext();} 5.添加数据try{ m_pRecordset->AddNew();//开始添加m_pRecordset->PutCollect("列名",(_bstr_t)m_id);m_pRecordset-->Update();//更新字段} 6.修改数据try{ m_pRecordset->Move((long)pos,vtMissing);m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);m_pRecordset-->Update();} 7.删除数据m_pRecordset->Move((long)pos,vtMissing);m_pAdoRecordset->Delete(adAffectCurrent);m_pRecordset-->Update(); try { //假设删除第10条记录 m_pRecordset->MoveFirst();//注意一定要移到第一个 m_pRecordset->Move(9); m_pRecordset->Delete(adAffectCurrent); //参数adAffectCurrent为删除当前记录 m_pRecordset->Update(); } catch(_com_error *e) { AfxMessageBox(e->ErrorMessage()); } 8.保存图片( 参考下一篇博客) char *m_pBuffer;//文件数据 DWORD m_filelen;//文件长度 VARIANT varblob; SAFEARRAY *psa; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound=0; rgsabound[0].cElements=m_filelen; psa=SafeArrayCreate(VT_UI1,1,rgsabound); for(long i=0;i<(long)m_filelen;i++) { SafeArrayPutElement(psa,&i,m_pBuffer++); } //记录值 varblob.vt=VT_ARRAY|VT_UI1; varblob.parray=psa; m_pRecordset->GetFields()->GetItem("PHOTO_DATA")->AppendChunk(varblob); m_pRecordset->Update();读取数据库语音数据long lDataSize=m_pRecordset->GetFields()->GetItem("voice")->ActualSize;//取得数据区域大小char *m_pBuffer;if(lDataSize>0){ //读取数据到varBLOB中_variant_t varBLOB;varBLOB=m_pRecordse->GetFields()->GetItem("voice")->GetChunk(lDataSize);if(varBLOB.vt==(VT_ARRAY|VT_UI1)) { if(m_pBuffer=new char[lDataSize+1]) { char *pBuf=0; SafeArrayAccessData(varBLOB.parray,(void**)&pBuf); memcpy(m_pBuffer,pBuf,lDataSize);//赋值数据到m_pBuffer SafeArrayUnaccessData(varBLOB.parray); } }} 其他连接方法打开 m_pAdoRecordset=NULL; m_pAdoConnect=NULL;//初始化 iCurrentOne=-1; //******************************************* if(FAILED(::CoInitialize(NULL)))//这句话很重要! { ::AfxMessageBox(_T("fail to CInitialize(NULL)")); PostQuitMessage(-8);//? } HRESULT hr=m_pAdoConnect.CreateInstance(__uuidof(Connection)); if(FAILED(hr)){ ::AfxMessageBox(_T("fail to create instance for _ConnectPtr")); PostQuitMessage(-8); } bstr_t strConnect="DSN=FRDB;\ DBQ=H:\\FRDB.accdb;\ DriverID=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"; try{ m_pAdoConnect->Open(strConnect,"clc","",NULL); } catch(_com_error &e) { ::AfxMessageBox(e.Description()); PostQuitMessage(-8); } m_pAdoRecordset=NULL; hr=m_pAdoRecordset.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)){ ::AfxMessageBox(_T("fail to create instance for _RecordsetPtr")); PostQuitMessage(-8); } m_pAdoRecordset->Open(_variant_t("Person"),_variant_t((IDispatch*)m_pAdoConnect,true),adOpenKeyset,adLockOptimistic,adCmdTable);
关闭 if(m_pAdoRecordset){ if(m_pAdoRecordset->State==adStateOpen){ m_pAdoRecordset->Close(); }} if(m_pAdoConnect) { if(m_pAdoConnect->State==adStateOpen){ m_pAdoConnect->Close();}} ::CoUninitialize();//关闭线程下的数据库添加数据m_pAdoRecordset->Fields->GetItem(_variant_t("NAME"))->Value=_variant_t(m_sName);载入数据m_sName=(CStringW)(m_pAdoRecordset->Fields->Item[_variant_t("NAME")]->Value);