Я пытаюсь получить количество записей для оператора 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
Собственность, без передачи всех строк клиенту
Задача ещё не решена.
Других решений пока нет …