Здравствуйте, Я, Вы писали:
M>Есть такая задача: сделать выборку из базы на MS SQL Server 2000 средствами OLE DB. Вроде бы всё сделал как в MSDN рекомендовано, но происходит дублирование последней записи. Мягко выражаясь, торможу — не могу понять в чём дело. Помогите дельным советом, пожалуйста!! Код ниже. SQL запрос оттестил — всё в порядке.
M>M>char* DbAccess::GetData(BOOL* RowsEndFlag, wchar_t** wRowsData)
M>{
M> hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtaned, &pRow);
M> if (FALSE(hr))
M> {
M> pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
M> delete [] pRowValues;
M> delete [] pDBBindStatus;
M> delete [] pDBBindings;
M> pIAccessor->ReleaseAccessor(hAccessor, NULL);
M> pIAccessor->Release();
M> pIColumnsInfo->Release();
M> pIRowset->Release();
M> pICommandText->Release();
M> pIDBCreateSession->Release();
M> pIDBInitialize->Uninitialize();
M> pIDBInitialize->Release();
M> CoUninitialize();
M> *RowsEndFlag = FALSE;
M> return "Error GetNextRows";
M> }
M> if (cRowsObtaned == 0)
M> {
M> *RowsEndFlag = FALSE;
M> delete [] pRowValues;
M> return "OK";
M> }
M> hr = pIRowset->GetData(rghRows[0], hAccessor, pRowValues);
M> if (FALSE(hr))
M> {
M> pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
M> delete [] pRowValues;
M> delete [] pDBBindStatus;
M> delete [] pDBBindings;
M> pIAccessor->ReleaseAccessor(hAccessor, NULL);
M> pIAccessor->Release();
M> pIColumnsInfo->Release();
M> pIRowset->Release();
M> pICommandText->Release();
M> pIDBCreateSession->Release();
M> pIDBInitialize->Uninitialize();
M> pIDBInitialize->Release();
M> CoUninitialize();
M> return "Error GetData from Rows";
M> }
M> for (ULONG nCol = 0; nCol < nCols; nCol++)
M> *(wRowsData + nCol) = (wchar_t*)&pRowValues[pDBBindings[nCol].obValue];
M> hr = pIRowset->ReleaseRows(cRowsObtaned, rghRows, NULL, NULL, NULL);
M> return "OK";
M>}
M>
M>Прошу строго не ругать за немного корявый код — это уже в процессе отладки захламилось — позже почищу. Главное сама идея.... И, просто не здесь инициализируется...
M>M>HROW rghRows[1];
M>HROW* pRow;
M>char* pRowValues;
M>//.......
M>pRow = &rghRows[0];
M>pRowValues = new char[cbRow]
M>
M>дабы не возникали всякие-разные подозрения....
Хотя я не понимаю почему бы не объявить HROW* rghRows = new HROW[1] и использовать уже &rghRow... Ну... так в MSDN...
Вопрос снят — ошибка было в обработке данных, получаемых от этой функции......