役に立ちそうもないTips移転版

俺得なTipsを書き連ねるだけのブログ。

SQLServerとEOFとタイムアウト

ADOでRecordsetをOpenするとまずEOFをチェックするが
こと、SQL Serverへつないでてタイムアウトを見たいときはEOF見ちゃダメ。

MSKB [PRB] ADO EOF は SQL7.0 では True を返すが SQL6.5 ではタイムアウトを返す

にあるとおり、タイムアウトするとEOFは単にFalseを返すのでしたorz

替わりにStatusを見ろ(そして例外を拾え)、とあるんだが、その理由が


「内部でMoveFirstを呼ぶから」
って、そんな実装詳細に依存しろっつわれてもorz


ちなみに、タイムアウトは例外(VBの場合Err)の情報を見ても分からんので、
(Err.Numberは汎用エラーの&H80004005なので見ても役に立たん)
ADOのConnection.Errorsの要素を見る。
で、SQLSTATEが「HYT00」ならタイムアウト
(なお、「StatusつーかMoveFirstしたら実はEOF/BOF」のときは、
むしろConnection.Errorsには何もなくてErr.Numberが3021、で判定……
(ちなみに、この「3021」、&H800A0BCDの上位16ビットがふっ飛んだものらしき。
VBSとかだと&H800A0BCD(のsigned int32で -2146825267)が来たりするorz)
なんでこうしちめんどくさいかなぁ)