msdn中有一个adosamp程序,就是用ado的。

解决方案 »

  1.   

    有一本书,叫用VC进行数据库编程,介绍了VC有关的数据库操作,包括ODBC,ADO,DAO,
    OLE DB,可以参考一下。VC知识库中也不相关的介绍.
      

  2.   

    _ConnectionPtr/_RecordsetPtr/_CommandPtr之类的类就是ADO的
      

  3.   

    使用VC++中的import指令,导入ado 的动态连接库msado15.dll,编译后,系统会自动产生ado的对应的C++类,很容易,记住了!
    步骤:
      1. 修改stdafx.h文件.
        #endif // _AFX_NO_AFXCMN_SUPPORT  //此行系统产生,
        #include <comdef.h>  //使用com类,会使数据库操作非常容易,一定要熟悉com!
        #import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" rename ("EOF","ADOEOF")
        using namespace ADODB;
      2.连接数据源
          //import指令的结果之一产生一些智能指针类,省去引用计数之苦.
       HRESULT hr;
    _ConnectionPtr pConnection;  
    _RecordsetPtr pRecordset;
    hr=pConnection.CreateInstance(__uuidof(Connection));
    if(SUCCEEDED(hr))
    {
    hr=pConnection->Open(_bstr_t(L"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\\毕业设计\\Superet2000.mdb;"),
    _bstr_t(L""),_bstr_t(L""),adModeUnknown);
    if(FAILED(hr))
    {
    AfxMessageBox("系统发生错误.",MB_OK);
        pConnection->Close();
    }
    else
    {
        _RecordsetPtr pRecordset;
        _variant_t vRecsAffected(0L);
    pRecordset=pConnection->Execute(strQuery,&vRecsAffected,adOptionUnspecified);
    if(pRecordset->GetADOEOF())
    {
    pRecordset->Close();
           pConnection->Close(); }
    else
    {
    pRecordset->Close();
                      pConnection->Close();

    } } } 
    3.进行数据库操作--增加,修改,删除,......
       以本人的毕业设计中一个程序片断为例:
    bool CSuperetView::AddNewAccount()
    {
    //增加新纪录
        _RecordsetPtr pRecordset;
    HRESULT hr;
    _bstr_t Query("select * from AccountBook where Date is NULL");
    _variant_t vNull;
    vNull.vt=VT_ERROR;
    vNull.scode=DISP_E_PARAMNOTFOUND;
        hr=pRecordset.CreateInstance(__uuidof(Recordset));
    if(SUCCEEDED(hr))
    {
    pRecordset->PutRefActiveConnection(m_pConnection);
    hr=pRecordset->Open(_variant_t(Query),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText);
    if(SUCCEEDED(hr))
    {
    COleSafeArray vaFieldList;
    vaFieldList.CreateOneDim(VT_VARIANT,5);
    long lArrayIndex[1];
    lArrayIndex[0]=0;
    vaFieldList.PutElement(lArrayIndex,&(_variant_t("Date")));
    lArrayIndex[0]=1;
    vaFieldList.PutElement(lArrayIndex,&(_variant_t("LastBalance")));
         lArrayIndex[0]=2;
    vaFieldList.PutElement(lArrayIndex,&(_variant_t("Balance")));
            lArrayIndex[0]=3;
    vaFieldList.PutElement(lArrayIndex,&(_variant_t("TurnInFund")));
            lArrayIndex[0]=4;
    vaFieldList.PutElement(lArrayIndex,&(_variant_t("TotalFund")));     COleSafeArray vaValueList;
    vaValueList.CreateOneDim(VT_VARIANT,5);
    lArrayIndex[0]=0;
    vaValueList.PutElement(lArrayIndex,&(vDate));
    lArrayIndex[0]=1;
    vaValueList.PutElement(lArrayIndex,&(vLastBalance));
         lArrayIndex[0]=2;
    vaValueList.PutElement(lArrayIndex,&(vBalance));
    lArrayIndex[0]=3;
    vaValueList.PutElement(lArrayIndex,&(vTurnInFund));
    lArrayIndex[0]=4;
    vaValueList.PutElement(lArrayIndex,&(vTotalFund)); pRecordset->AddNew(&vaFieldList,&vaValueList);
    pRecordset->Close();
    return true;
    }
    }
    return false;
    }
     其它操作,自己可要"摸索"了,多看import指令产生的文件.有了心得,可别旺了通知我一声,祝你好运!
      

  4.   

    recordnum=m_pRecordset->Open(SqlStr,m_pConnection.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
    //用 recordnum=m_pRecordset->Open(SqlStr,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    // 也出错  
    recordnum=m_pRecordset->adoEOF; 
    //执行到此出错,为何。跳到catch(...)
    ------------------------------------------
    好像open并不能返回记录总数吧。我用的是m_pRecordset->GetRecordCount(),还有就是m_pRecordset->adoEOF也不是返回记录总数,只是返回一个BOOL型数据,判断是否到了表底。
    所以先open,然后GetRecordCount(要用adOpenKeyset,否则始终返回-1)