• MFC ADO数据库操作


    MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/

    内容比较乱,作为草稿,对现有的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);

  • 相关阅读:
    dev控件学习笔记之----CxGrid2
    dev控件学习笔记之----CxGrid
    Bootstrap-table一个表格组件神器(学习一)使用详情
    vue学习(十一)组件全攻略
    bower学习(三)npm和bower的区别
    bower学习(二)命令
    brower学习(一)安装
    动画方案animate.css学习(一)
    vue学习(十)v-bind全攻略
    Vue学习(九)v-model全攻略
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/7403666.html
Copyright © 2020-2023  润新知