KB2527572
TFS 2010 SP1のパッチ。Prc_pendaddという処理(リモート呼び出しなんでしょうね)が6-10倍(?)遅いという現象を解決するhotfix。KBはなしKB2001668
Visual Studio 2010 SP1のMFCにあるCRecordset::BuildUpdateSQLというメソッド。これが64bit環境においてSQLGetCursorNameが18以上の値を返してしまう場合に失敗するという問題を修正する。ちょっと説明必要ですね。MFCのソース(dbcore.cpp)において、CRecordset::BuildUpdateSQL()はこうなっています。
// Get predefined cursor name from datasource RETCODE nRetCode; TCHAR szCursorName[MAX_CURSOR_NAME+1]; SWORD nLength = _countof(szCursorName)-1; AFX_SQL_SYNC(::SQLGetCursorName(m_hstmt, reinterpret_cast<SQLTCHAR *>(szCursorName), _countof(szCursorName), &nLength)); if (!Check(nRetCode)) ThrowDBException(nRetCode); m_strCursorName = szCursorName;
そして、SQLGetCursorNameが格納する変数領域、szCursorNameはMAX_CURSOR_NAMEまでしか受け取れません。MAX_CURSOR_NAMEはafxdb.hで18と定義されています。なので、SQLGetCursorNameがTCHARで18以上の配列を返却されると困るわけです。それをなおすよということです。
SQLGetCursorNameはODBCのAPIのようですね。
SQLGetCursorName Function
Bufferが足りないことがあるので長さを確認してから同的に取得するようにしたんでしょうか?でもこのコードだったらx86でもx64でも発生しそうなものなんですが…。