kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

VS Hotfix Listsに追加

Visual Studio 2010 Hotfix

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はODBCAPIのようですね。
SQLGetCursorName Function
Bufferが足りないことがあるので長さを確認してから同的に取得するようにしたんでしょうか?でもこのコードだったらx86でもx64でも発生しそうなものなんですが…。