20億円を超えるMONEY型値とADODB.RecordsetのGetRowsメソッドの罠
おおよそ20億円を超える金額値を含むレコードセットでGetRowsメソッドを呼び出すと下記のエラーが発生します。
Microsoft OLE DB Provider for SQL Server: MONEY 値から int に変換した結果を格納するための領域がありません。(-2147217833)
GetRowsメソッドはhttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdmthgetrows.aspの通り、Variant型の配列を返しますが、SQL ServerのMONEY型はVBScriptのLong型に変換するようです。その結果、オーバーフローするみたい。
いちおうVBScript、http://www.keynus.co.jp/~uhara/html/vbscript/7.htmのように通貨型はあるんだけど、通貨型は使ってくれません。たぶん、COMインターフェース上に通貨型が無いんだよね。
VBやVBScriptには32ビットを超える整数値を扱うすべがないので、DB側で制約を定義して32ビットを超えないように制限するのが無難な気がします。
#実数値で扱うという苦しい逃げ道もあるみたい
20億円を超える金額って、証券デリバティブみたいな金融関係の業務でしか扱わないでしょうし、そのような業務にVBやVBScriptは無縁でしょうw