class CSpQueryAccessor
{
public:
LONG m_RETURNVALUE;
LONG m_dwSvrID;
LONG m_ulFetch;
LONG m_coldwNID;
LONG m_coldwPID;
LONG m_coldwType;
LONG m_coldwStyle;

BEGIN_PARAM_MAP(CSpQueryAccessor)
SET_PARAM_TYPE(DBPARAMIO_OUTPUT)
COLUMN_ENTRY(1, m_RETURNVALUE)
SET_PARAM_TYPE(DBPARAMIO_INPUT)
COLUMN_ENTRY(2, m_dwSvrID)
SET_PARAM_TYPE(DBPARAMIO_INPUT | DBPARAMIO_OUTPUT)
COLUMN_ENTRY(3, m_ulFetch)
END_PARAM_MAP()BEGIN_COLUMN_MAP(CSpQueryAccessor)
COLUMN_ENTRY(1, m_coldwNodeID)
COLUMN_ENTRY(2, m_coldwParentID)
COLUMN_ENTRY(3, m_coldwType)
COLUMN_ENTRY(4, m_coldwStyle)
END_COLUMN_MAP()DEFINE_COMMAND(CSpQueryAccessor, _T("{ ? = CALL dbo.sp_Query;1 (?,?) }"))
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};typedef CCommand< CAccessor< CSpQueryAccessor >, CRowset, CMultipleResults > CSpQuery;// 以上由ATL自动生成OLEDB代码,通过如下代码获取第一记录集中数据成功:
CSpQuery qnBys;
qnBys.m_dwSvrID = dwSvrID; if ( SUCCEEDED ( hr = qnBys.Open( *pSession ) ) )
{
while ( S_OK == qnBys.MoveNext() ) 
{
node_array.append((void**)&pNodeInfo);

pNodeInfo->dwNodeID = qnBys.m_coldwNodeID;
pNodeInfo->dwParent = qnBys.m_coldwParentID;
pNodeInfo->dwType = qnBys.m_coldwType;
pNodeInfo->dwStyle = qnBys.m_coldwStyle;

*pulFetch = node_array.size();
if ( *pulFetch == 0 )
{
qnBys.Close();
m_SessionPool.FreeSession( uIndex );
*ppNodeInfo = NULL;
return S_OK;
}
                  // 这里处理第一记录集中数据
                  // ......
//代码获取第二记录集中有8个字段内容
LONG lRowAffected;
if( FAILED( hr = qnBys.GetNextResult( &lRowAffected, true ) ) )
{
qnBys.Close();
m_SessionPool.FreeSession( uIndex );
return hr;
}// 请教在这里如何通过OLEDB访问多记录集,即如何访问返回的第二记录集中的数据。

解决方案 »

  1.   

    有点提示也可以啊,或者是否我用的方式不对?
    我将
    BEGIN_COLUMN_MAP(CSpQueryAccessor)
    COLUMN_ENTRY(1, m_coldwNodeID)
    COLUMN_ENTRY(2, m_coldwParentID)
    COLUMN_ENTRY(3, m_coldwType)
    COLUMN_ENTRY(4, m_coldwStyle)
    END_COLUMN_MAP()
    改为:
    BEGIN_ACCESSOR_MAP(CSpQueryNodeByServerAccessor, 2)
       BEGIN_ACCESSOR(0, true)    // true specifies an auto accessor
    COLUMN_ENTRY(1, m_coldwNodeID)
    COLUMN_ENTRY(2, m_coldwParentID)
    COLUMN_ENTRY(3, m_coldwType)
    COLUMN_ENTRY(4, m_coldwStyle)
       END_ACCESSOR()
       BEGIN_ACCESSOR(1, false)   // false specifies a manual accessor
    COLUMN_ENTRY(1, m_coldwNodeID)
    COLUMN_ENTRY(2, m_coldwParentID)
    COLUMN_ENTRY(3, m_coldwType)
    COLUMN_ENTRY(4, m_coldwStyle)
    COLUMN_ENTRY(5, m_colszName)
    COLUMN_ENTRY(6, m_colszDescription)
    COLUMN_ENTRY(7, m_colStatus)
    COLUMN_ENTRY(9, m_colszPath)
       END_ACCESSOR()
    END_ACCESSOR_MAP()能获取第一记录集的数据,在GetNextResult后,所有数据仍然映射在ACCESSOR(0)中,需要如何才能获取第二记录集中的数据
      

  2.   

    我已经解决了,具体改动比较多,主要是定义不同的ACCESSOR,并通过GetData更新不同ACCESSOR
    不过不知道有没有其他方法,请给出提示,谢谢!
      

  3.   

    总结一下问题的答案:在OLEDB中可以有两种方式解决多记录集访问的方式:
    1.动态创建Accessor,通过GetValue访问每一个记录,通过GetNextResult方法访问第二记录集,再通过GetValue访问下一记录集的数据:
      CCommand<CDynamicParameterAccessor, CRowset, CMultipleResults> cmd;
      if ( FAILED ( hr = cmd.Create(...
      if ( FAILED ( hr = cmd.Prepare(...
      if ( FAILED ( hr = cmd.BindParameters(...
      if ( FAILED ( hr = cmd.SetParam(...
      ...
      if ( FAILED ( hr = cmd.Open(...
      while ( S_OK == cmd.MoveNext() )
      {
    NodeInfo.dwNodeID = *( (LONG *)cmd.GetValue( (ULONG)1 ) );
             ...
      }
      LONG lRowsAffected = 0;
      if ( FAILED ( hr = cmd.GetNextResult( &lRowsAffected ) ) ) {...
      while ( S_OK == cmd.MoveNext() )
      {
    NodeInfo2.dwNodeID = *( (LONG *)cmd.GetValue( (ULONG)1 ) );
             ...
      }
      cmd.Close();
      

  4.   

    学习
    我看以前解决多个记录集也是用同样的方法
    ADO:NextRecordset
    OLE DB:GetNextResult
      

  5.   

    http://search.csdn.net/Expert/topic/1664/1664700.xml?temp=.9561426
      

  6.   

    2.改BEGIN_COLUMN_MAP绑定方式为BEGIN_ACCESSOR_MAP方式绑定,通过GetNextResult方法和GetData方法结合实现,绑定方式如2楼所述,下面为访问代码:
      LONG lRowAffected;
      if( FAILED( hr = qnBys.GetNextResult( &lRowAffected, true ) ) )
      {
       qnBys.Close();
       m_SessionPool.FreeSession( uIndex );
       return hr;
      }  {
       while ( S_OK == qnBys.MoveNext() ) 
       {
       qnBys.GetData( 1 );
       pResInfo->dwNodeID = qnBys.m_coldwNodeID;
                      ...