私は Windows 上に、(ADO.NET ではなく) 単純な古い ADO を使用して一連の SQL Server データベースからデータを取得する C++ コードをいくつか持っています。このコードでは、順方向専用カーソルを使用して、大きな Recordset を生成するクエリで最大のデータ スループットを実現するために、消防ホース カーソルを許可します。
結果を処理するコードは、ADO 2.7 の #import によって生成されたラッパーを使用して、次のようになります。
ADODB::_RecordsetPtr records("ADODB.Recordset");
records->Open(cmd, _variant_t(static_cast<IDispatch *>(m_DBConnection)), ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
if (!(records->BOF && records->EOF))
{
... Loop over the recordset and extract data from each record ...
}
プロファイリングでは、上記のループの 40% 近くが BOF の呼び出しに費やされており、これがデータベース コード全体の読み取りパフォーマンスに大きな影響を与えていることが示されています。コードは前方スクロールのみのカーソルを使用するため、前方スクロールのみのカーソルを使用する場合は常に -1 であるため、RecordCount プロパティを確認することはできません。
BOF/EOF チェックを使用していない空の Recordset をチェックする別の方法、またはこのチェックを高速化する方法はありますか?
現時点で考えられるもう 1 つの方法は、他のカーソル タイプのいずれかを使用して、それがデータ スループットにどのように影響するかを確認することです。