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访问多记录集,即如何访问返回的第二记录集中的数据。
{
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访问多记录集,即如何访问返回的第二记录集中的数据。
我将
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)中,需要如何才能获取第二记录集中的数据
不过不知道有没有其他方法,请给出提示,谢谢!
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();
我看以前解决多个记录集也是用同样的方法
ADO:NextRecordset
OLE DB:GetNextResult
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;
...