ADODB :: Recordset: RecordCount, выбирающий каждую строку

Я пытаюсь получить количество записей для оператора Select и набора записей одновременно.

Объект Recordset предлагает RecordCount Недвижимость для этого вопроса.

Он работает просто отлично, используя статический серверный курсор, но если я просматриваю события в SQL Server Profiler, я понимаю, что он, похоже, извлекает каждую строку из всего набора записей только для подсчета строк.

С другой стороны, я могу сделать MoveLast на наборе записей и Bookmark содержит индекс последней строки (== Recordcount).
Я не хочу использовать Закладку вместо RecordCount и задаюсь вопросом, может ли кто-нибудь объяснить это поведение.

Если кто-то заинтересован, я создал небольшой пример кода для его воспроизведения:

::CoInitialize(NULL);

ADODB::_ConnectionPtr pConn;
HRESULT hr;
hr = pConn.CreateInstance(__uuidof(ADODB::Connection));
pConn->CursorLocation = ADODB::adUseServer;
pConn->ConnectionTimeout = 0;
pConn->Provider = "SQLOLEDB";
pConn->Open(bstr_t("Provider=sqloledb;Data Source=s11;Initial Catalog=...;Application Name=DBTEST"), "", "", ADODB::adConnectUnspecified);

// Create Command Object
_variant_t  vtRecordsAffected;
ADODB::_CommandPtr cmd;
hr = cmd.CreateInstance(__uuidof(ADODB::Command));
cmd->ActiveConnection = pConn;
cmd->CommandTimeout = 0;

// Create a test table
cmd->CommandText = _bstr_t("create table #mytestingtab (iIdentity INT)");
cmd->Execute(&vtRecordsAffected, NULL, ADODB::adCmdText);

// Populate
cmd->CommandText = _bstr_t(
"DECLARE @iNr INT\r\n""SET @iNr = 0\r\n""WHILE @iNr < 10000\r\n""BEGIN\r\n""  INSERT INTO #mytestingtab (iIdentity) VALUES (@iNr)\r\n""  SET @iNr = @iNr + 1\r\n""END\r\n");
cmd->Execute(&vtRecordsAffected, NULL, ADODB::adCmdText);

// Create a Recordset Object
_variant_t  vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
ADODB::_RecordsetPtr Recordset;
hr = Recordset.CreateInstance(__uuidof(ADODB::Recordset));
Recordset->CursorLocation = ADODB::adUseServer;

cmd->CommandText = _bstr_t(
"SELECT * FROM #mytestingtab");
Recordset->PutRefSource(cmd);
Recordset->Open(vtEmpty, vtEmpty, ADODB::adOpenStatic, ADODB::adLockReadOnly, ADODB::adCmdText);

// Move to the Last Row
Recordset->MoveLast();
_variant_t bookmark = Recordset->Bookmark;

// Recordcount
long tmp = Recordset->RecordCount;

Recordset->Close();
pConn->Close();

::CoUninitialize();

Есть ли способ использовать Recordset Собственность, без передачи всех строк клиенту

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector