C++ ADODB::记录集:获取每行的记录计数

C++ ADODB::记录集:获取每行的记录计数,c++,c,sql-server,oledb,adodb,C++,C,Sql Server,Oledb,Adodb,我尝试一次接收Select语句的记录数和记录集 Recordset对象为此问题提供RecordCount属性 使用一个静态的服务器端游标,它可以正常工作,但是如果我在SQLServer事件探查器中查看事件,我意识到,它似乎可以获取整个记录集的每一行,只是为了计算行数 另一方面,我可以对记录集执行MoveLast,书签包含最后一行的索引==Recordcount。 我不想使用书签而不是RecordCount,不知道是否有人可以解释这种行为 如果有人感兴趣,我创建了一个小代码示例来复制它: ::Co

我尝试一次接收Select语句的记录数和记录集

Recordset对象为此问题提供RecordCount属性

使用一个静态的服务器端游标,它可以正常工作,但是如果我在SQLServer事件探查器中查看事件,我意识到,它似乎可以获取整个记录集的每一行,只是为了计算行数

另一方面,我可以对记录集执行MoveLast,书签包含最后一行的索引==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属性???

这看起来不像C。您可以更新问题的语言标记。作为获得记录数的解决方法,您可以使用单独的查询:从表中选择count*,其中[conditions]