Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос по OLE DB


Автор: shedon 11.12.2003, 09:22
Как получить кол-во записей в таблице, номер текущей записи и перейти на какуюто запись(по номеру) ?

Автор: DENNN 15.12.2003, 10:51
Код

long GetDBRecordCount(CSession& ssn, LPCTSTR lpszTable, LPCTSTR lpszClause)
{
long nCount = 0L;
ULONG ulSize = sizeof( long );
PBYTE pBuf = (PBYTE)&nCount;

CCommand<CManualAccessor> rs;
HRESULT hr = rs.CreateAccessor(1 , (PVOID)pBuf , ulSize);
if (FAILED( hr ))
{
 TRACE0(_T("GetDBRecordCount CreateAccessor failed...\n"));
 AtlTraceErrorRecords( hr );
 return( -1L );
}

rs.AddBindEntry(1 , DBTYPE_I4 , sizeof( long ) , (PVOID)pBuf , NULL , NULL);

CString strSQL(_T("SELECT COUNT(*) FROM "));
strSQL += lpszTable;
if ( lpszClause )
{
 strSQL += _T(' ');
 strSQL += lpszClause;
}

hr = rs.Open(ssn , strSQL);
if (FAILED(hr))
{
 TRACE0(_T("GetDBRecordCount Open failed...\n"));
 AtlTraceErrorRecords( hr );
 return( -1L );
}
hr = rs.MoveNext();

rs.Close();
return( nCount );
}

Автор: shedon 15.12.2003, 11:24
DENNN, СПАСИБО

Автор: shedon 15.12.2003, 13:31
Да, забыл, а как получить номер текущей записи ? и что такое lpszClause

Автор: DENNN 15.12.2003, 14:35
lpszClause - это указатель на строку символов, указывающих условие (например WHERE id>100), если нужно подсчитать записи во всей таблице, то этот указатель надо оставить пустым.
Цитата
а как получить номер текущей записи

Сейчас не помню, дело в том, что этот механизм будет работать не всегда. По стандарту, запись в таблице не может иметь порядкового номера, а ее порядковый номер в выборке вида SELECT * from <table> лишь условность у тебя на экране. В жизни все не совсем так, и во многих БД есть понятие номера. Но и это для тебя не важно. Для тебя важно лишь то, каким драйвером (читай "провайдером данных") пользуешься ты в своей программе. От этого и будет зависит механизм и возможность получение такого нмера. Кроме того, важно какие флаги установлнны в объекте CSession при создании подключения.
Вообщем, лучше написать свой менеджер данных, выдающий необходимую информацию скажем для объекта отображения в архитектуре документ-вид.

Автор: shedon 15.12.2003, 14:51
Цитата

Вообщем, лучше написать свой менеджер данных, выдающий необходимую информацию

Я примерно так и сделал.

Автор: DENNN 15.12.2003, 15:21
Прикрути к нему кеширование и можешь смело переключаться на более насущные проблемы smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)