我用的是COM提供的API来操作ADO ,可是不知道怎么得到记录集的值。望高手帮忙。
我急着用,哪位解决了我再开一贴给100分.
  HRESULT hr = S_OK; 
    ADORecordset *pRs1 = NULL; 
    ADOConnection *pConn1;
    VARIANT Source; 
    VARIANT Connect;
VARIANT adoConn1;
    VariantInit( &Source ); 
    VariantInit( &Connect ); 
VariantInit( &adoConn1 ); 
adoConn1.vt = VT_BSTR; 
    adoConn1.bstrVal = SysAllocString( L"pConn1"); 
    Source.vt = VT_BSTR; 
    Source.bstrVal = SysAllocString( L"SELECT count(*) FROM Customers"); 
    Connect.vt = VT_BSTR; 
    Connect.bstrVal = SysAllocString( L"Provider=SQLOLEDB;Server=ZYQ;Database=Northwind;UID=sa;PWD=19781130;"); 
if FAILED(hr = CoInitialize (NULL))//初始化COM
{
MessageBox (hWnd, _TEXT("CoInitialize Failed"), _TEXT("Error"), MB_OK);
return FALSE;
}
hr=CoCreateInstance( CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,IID_IADOConnection, (LPVOID *) &pConn1 ); 
hr=pConn1->Open(Connect.bstrVal,NULL,NULL,adConnectUnspecified);
    hr = CoCreateInstance( CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,IID_IADORecordset, (LPVOID *) &pRs1 ); 
    if( SUCCEEDED( hr ) ) 
//hr = pRs1->Open(Source,adoConn1,adOpenForwardOnly,adLockReadOnly,adCmdText );
hr=pConn1->Execute(Source.bstrVal,NULL,adCmdText, &pRs1);
/** 上面的代码都可以正常运行,hr都为0  **/
long aaa=0;
hr=pRs1->MoveFirst();
hr=pRs1->get_RecordCount(&aaa);
/**上面这句hr也为0,可aaa=-1,这是为什么呀?肯定应该有接果呀。**/
    //hr=pRs1->GetRows(1,Connect,adoConn1,&Source);
/**上面这句 GetRows()函数的参数是怎么用的,我怎么也得不到结果。如果这样调用不对,那怎么样才能得到正确结果呢?**/
//MessageBoxW (hWnd, Source.bstrVal, L"Error", MB_OK);

解决方案 »

  1.   

    在hr = pRs1->Open(Source,adoConn1,adOpenForwardOnly,adLockReadOnly,adCmdText );之前加上:pRs1->CursorLocation  =  adUseClient;    //使用客户端游标  另外,你这种调用ADO的方式太繁了,建议用import的方式来调用ADO。。
      

  2.   

    介绍一篇学习的文章:http://www.vckbase.com/document/viewdoc/?id=1215
      

  3.   

    應該把游标設置成客户端游标!CursorLocation  =  adUseClient;
      

  4.   

    楼上几位说的没错把游标设置成客户端
    pRsl->Cursorlocation=adUseClient;
      

  5.   

    大家说的对,把游标设置成客户端可以得到正确的结果集了,可是怎样得到结果集中的结果呢。例如将这个结果放在long型变量中,是用下面这个GetRows吗?这个函数怎么用呀,VARIANT的类型应该用什么?bstrVal?intVal?还是应该用其他的函数?
    virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetRows( 
                /* [defaultvalue][in] */ long Rows,
                /* [optional][in] */ VARIANT Start,
                /* [optional][in] */ VARIANT Fields,
                /* [retval][out] */ VARIANT __RPC_FAR *pvar) = 0;
      

  6.   

    long itemp; 
    itemp = atol(_com_util::ConvertBSTRToString((_bstr_t)m_pRs->GetCollect("字段名"));
      

  7.   

    long itemp; 
    itemp = atol(_com_util::ConvertBSTRToString((_bstr_t)pRsl->GetCollect("字段名"));
      

  8.   

    普通的:
    1.stdafx.h中加入
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
    2。app文件的InitInstance中加入
    if(S_OK!=OleInitialize(NULL))
    {
    AfxMessageBox("初始化COM组件库错误");
    }
    下面就是数据库操作
    _ConnectionPtr pConn;
    _RecordsetPtr  pRs;
    CString strSQL;
    pConn.CreateInstance(__uuidof(Connection));
    pConn->CursorLocation=adUseClient;
    strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
    pConn->Open(_bstr_t(strSQL),"","",-1);

    pRs.CreateInstance(__uuidof(Recordset));
    pRs->CursorLocation=adUseClient;
    pRs->PutActiveConnection(pConn.GetInterfacePtr());

    pRs1.CreateInstance(__uuidof(Recordset));
    pRs1->CursorLocation=adUseClient;
    pRs1->PutActiveConnection(pConn.GetInterfacePtr()); strSQL="select * from catalog order by cataid";
    pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
    ATL作COM组件内使用数据库:
    STDMETHODIMP COperatorM::SaveRsByJSBM(BSTR jsbm, _Recordset *pSaveRs)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
    _ConnectionPtr pConn;
    _RecordsetPtr  pRs;
    _RecordsetPtr  pDelRs;
    _RecordsetPtr  pUserRs;
    _variant_t _vValue;
    CString mkbm;
    CString yhbm;
    try
    {
    //修改一个角色的用户列表:需要删除原来的隶属于此角色的用户的权限
    //删除用户列表,添加新的用户列表,添加新的用户权限
    //MessageBox(NULL,"aa","succeed",MB_OK );
    CString tempsql;
    pConn.CreateInstance(__uuidof( Connection ) );
    pConn->CursorLocation = adUseClient;  
    pConn->Open(dsn,"sa","",-1 );
    pConn->BeginTrans();
    pRs.CreateInstance(__uuidof( Recordset ) );
    pRs->CursorLocation = adUseClient;
    pRs->PutActiveConnection(pConn.GetInterfacePtr());

    pUserRs.CreateInstance(__uuidof( Recordset ) );
    pUserRs->CursorLocation = adUseClient;
    pUserRs->PutActiveConnection(pConn.GetInterfacePtr()); pDelRs.CreateInstance(__uuidof( Recordset ) );
    pDelRs->CursorLocation = adUseClient;
    pDelRs->PutActiveConnection(pConn.GetInterfacePtr());
    //删除隶属于此角色的用户的权限
    //tempsql="select bm,mkbm from gy_qxb where  bm='"+CString(jsbm)+"'";
    tempsql.Format("select bm,mkbm from gy_qxb where yhbz='0' and bm='%s'",(char*)(_bstr_t)jsbm);
    //MessageBox(NULL,"bb","succeed",MB_OK );
    pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    tempsql="select yhbm from gy_yhjs where jsbm='"+CString(jsbm)+"'";
    pUserRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    //MessageBox(NULL,"OK","succeed",MB_OK );
    while(!pRs->adoEOF)
    {
    //取出mkbm
    _vValue=pRs->GetCollect("mkbm");
    if(_vValue.vt!=VT_NULL)
    {
    _vValue.ChangeType(VT_BSTR);
    mkbm=_vValue.bstrVal;
    if(!pUserRs->adoEOF)
    {
    while(!pUserRs->adoEOF)
    {
    _vValue=pUserRs->GetCollect("yhbm");
    if(_vValue.vt!=VT_NULL)
    {
    _vValue.ChangeType(VT_BSTR);
    yhbm=_vValue.bstrVal;
    tempsql="delete from gy_qxb where yhbz='1' and bm='"+yhbm+"' and mkbm='"+mkbm+"'";
    pDelRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    }
    pUserRs->MoveNext();
    }
    pUserRs->MoveFirst();
    }
    }
    pRs->MoveNext();
    }
    //删除gy_yhjs表中的原有的角色用户列表
    tempsql="delete from gy_yhjs where jsbm='" +CString(jsbm)+"'";
    pRs->Close();
    pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    //添加新的用户列表
    pSaveRs->PutActiveConnection(pConn.GetInterfacePtr());
    pSaveRs->UpdateBatch(adAffectAll);
    //M//essageBox(NULL,"OK","succeed",MB_OK );
    //添加新的用户权限
    tempsql="select mkbm from gy_qxb where yhbz='0' and bm='"+CString(jsbm)+"'";
    pUserRs->Close();
    pUserRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    if(!pSaveRs->adoEOF)
    pSaveRs->MoveFirst();
    while(!pSaveRs->adoEOF)
    {
    _vValue=pSaveRs->GetCollect("yhbm");
    if(_vValue.vt!=VT_NULL)
    {
    _vValue.ChangeType(VT_BSTR);
    yhbm=_vValue.bstrVal;
    if(!pUserRs->adoEOF)
    {
    while(!pUserRs->adoEOF)
    {
    _vValue=pUserRs->GetCollect("mkbm");
    if(_vValue.vt!=VT_NULL)
    {
    _vValue.ChangeType(VT_BSTR);
    mkbm=_vValue.bstrVal;
    tempsql="insert gy_qxb values('"+yhbm+"','"+mkbm+"','1')";
    pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
    }
    pUserRs->MoveNext();
    }
    pUserRs->MoveFirst();
    }
    }
    pSaveRs->MoveNext();
    }
    //MessageBox(NULL,"OK","succeed",MB_OK );
    pRs ->PutRefActiveConnection( NULL );
    pDelRs ->PutRefActiveConnection( NULL );
    pSaveRs ->PutRefActiveConnection( NULL );
    pUserRs ->PutRefActiveConnection( NULL );
    // 关闭连接
    if( pConn ->GetState() == adStateOpen )
    {
    pConn->CommitTrans ();
    pConn ->Close();
    }
    pConn = NULL;
    }
    catch(_com_error &e)
    {
    pConn->RollbackTrans();
    pConn->Close();
    pConn=NULL;
    return AtlReportError(CLSID_OperatorM,_com_util::ConvertBSTRToString(e.Description()),IID_IOperatorM,E_FAIL);
    }
    catch(...)
    {
    pConn->RollbackTrans();
    pConn->Close();
    pConn=NULL;
    return AtlReportError(CLSID_OperatorM,"未知错误",IID_IOperatorM,E_FAIL); }
    return S_OK;
    }