Дублирование последней записи выборки
От: matveykin Украина  
Дата: 01.04.08 16:25
Оценка:
Есть такая задача: сделать выборку из базы на MS SQL Server 2000 средствами OLE DB. Вроде бы всё сделал как в MSDN рекомендовано, но происходит дублирование последней записи. Мягко выражаясь, торможу — не могу понять в чём дело. Помогите дельным советом, пожалуйста!! Код ниже. SQL запрос оттестил — всё в порядке.

char* DbAccess::GetData(BOOL* RowsEndFlag, wchar_t** wRowsData)
{
    hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtaned, &pRow);
    if (FALSE(hr))
    {
        pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
        delete [] pRowValues;
        delete [] pDBBindStatus;
        delete [] pDBBindings;    
        
        pIAccessor->ReleaseAccessor(hAccessor, NULL);
        pIAccessor->Release();
        pIColumnsInfo->Release();
        pIRowset->Release();
        pICommandText->Release();
        pIDBCreateSession->Release();
        pIDBInitialize->Uninitialize();
        pIDBInitialize->Release();
        CoUninitialize();
        *RowsEndFlag = FALSE;
        return "Error GetNextRows";
    }    

    if (cRowsObtaned == 0)
    {
        *RowsEndFlag = FALSE;
        delete [] pRowValues;
        return "OK";
    }

    hr = pIRowset->GetData(rghRows[0], hAccessor, pRowValues);
    if (FALSE(hr))
    {
        pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
        delete [] pRowValues;
        delete [] pDBBindStatus;
        delete [] pDBBindings;
        
        pIAccessor->ReleaseAccessor(hAccessor, NULL);
        pIAccessor->Release();
        pIColumnsInfo->Release();
        pIRowset->Release();
        pICommandText->Release();
        pIDBCreateSession->Release();
        pIDBInitialize->Uninitialize();
        pIDBInitialize->Release();
        CoUninitialize();
        return "Error GetData from Rows";
    }

        for (ULONG nCol = 0; nCol < nCols; nCol++)
            *(wRowsData + nCol) = (wchar_t*)&pRowValues[pDBBindings[nCol].obValue];
    
    hr = pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
    
    return "OK";
}

Прошу строго не ругать за немного корявый код — это уже в процессе отладки захламилось — позже почищу. Главное сама идея.... И, просто не здесь инициализируется...

HROW rghRows[1];
HROW* pRow;
char* pRowValues;
//.......
pRow = &rghRows[0];
pRowValues = new char[cbRow]


дабы не возникали всякие-разные подозрения.... Хотя я не понимаю почему бы не объявить HROW* rghRows = new HROW[1] и использовать уже &rghRow... Ну... так в MSDN...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.