有以下代码,将满足条件的书签数组作为记录集的过滤条件,本应过滤后有多条记录,但结果且只处理了原先记录集中的第一条记录,何故? int nCount=0;
_variant_t* pVarBook; // 如果记录数大于0,输出数据
if( pRecordSet && pRecordSet->GetRecordCount() > 0)
{
pVarBook = new _variant_t[ pRecordSet->GetRecordCount() ]; // 移动到表头
pRecordSet->MoveFirst(); // 读取每一条数据
while( !pRecordSet->IsEOF() )
{
// 记录满足条件的书签
if(满足条件)
{
// 记录当前书签
pVarBook[nCount] = pRecordSet->GetBook(); // 记录书签个数
nCount++;
} pRecordSet->MoveNext();
}// end while // 设置过滤条件
// --------------------------------------------------------------------
_variant_t varFilter;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1]; rgsabound[0].cElements = nCount;
rgsabound[0].lLbound = 0; psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound); for( long i=0 ;i<nCount; i++ )
SafeArrayPutElement( psa, &i, &pVarBook[i] ); varFilter.vt  = VT_ARRAY | VT_VARIANT;
varFilter.parray = psa;

bool bl = pRecordSet->PutFilter( varFilter );
// --------------------------------------------------------------------
}// end if

解决方案 »

  1.   

    书签作为一个定位记录位置作用的,过滤是对不符合条件记录的进行排除,他们不是一个概念。PutFilter是SQL语句的where子语句。
      

  2.   

    可PutFilter的其中一种参数形式就是传递书签数组
      

  3.   

    操作_variant_t数组可以用CComSafeArray 试试。
    pVarBook = new _variant_t[ pRecordSet->GetRecordCount() ];
    if(满足条件)
    {
    // 记录当前书签
    pVarBook[nCount] = pRecordSet->GetBook();// 记录书签个数
    nCount++;
    }
    创建的数组个数和使用的个数不一致。