トップ回答者
VB2005 CInt、CTypeなどの変換エラー

質問
-
お世話になります。早速ですが、質問させていただきます。
VB2005で作成したアプリケーションを、Windows Server 2008上で動作させております。
今まで正常に動作していたアプリケーションが、突然エラーとなり正常に動作しなくなる現象が発生しました。
エラー内容としては、「String "0" から型 'Integer' への変換は無効です。」といった内容であり、CInt関数を利用している部分で発生しております。
(エラー内容をログ出力しており、そのログをコピー&ペースト等で確認する限り、"0"は数値のゼロで間違いありません。)
よくよく確認してみると、その他のアプリケーションにおいてもCIntやCType関数を利用している部分ですべて同じようなエラーとなっている状況でした。
また、現象は10分~2時間程度で自然と回復しており、原因を特定する事が非常に困難な状況です。
どなたか原因がわかる方、同様な現象で悩まされた方がいらっしゃいましたら、ご教示頂けます様よろしくお願い致します。
回答
-
# エラー メッセージを英語にして検索してみただけですが...。
現象が突然発生して自然と回復するという点の説明はつかないですが、次の KB が該当しているかもしれません。
System.InvalidCastException when Casting to Numeric data types
http://support.microsoft.com/kb/948478
あるいは各アプリケーションの先頭で明示的に Culture を指定してしまうとか。
Conversion from string "0" to type 'Integer' is not valid.
http://social.msdn.microsoft.com/Forums/eu/vbgeneral/thread/6246fab6-74db-4b18-a0ba-2c5d5d686294
# 誰か他のところで地域と言語の設定をいじくっていたりするんでしょうか。 -
それぞれの機能毎にEXEファイルを作成し、メニューからそのEXEを呼び出しております。(クラス実行)
一旦現象が発生すると、それらの複数の機能において、CInt系の処理がことごとくエラーとなっています。書式設定はスレッドごとに保持されています。
アプリケーションを都度起動するような構成だとすると、もしも書式設定が書き換わる何かがあれば、その機能を実行したときの設定を保持し続けるのでその EXE を再起動しない限りはエラーになるのでしょうね。現象がどうしても押さえ込めないのなら、起動時に Thread.CurrentThread.CurrentCulture とか CurrentUICulture とかを特定の CultureInfo で上書きしてしまうとかもありかなぁ。(あくまで回避、対症療法です)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
すべての返信
-
# エラー メッセージを英語にして検索してみただけですが...。
現象が突然発生して自然と回復するという点の説明はつかないですが、次の KB が該当しているかもしれません。
System.InvalidCastException when Casting to Numeric data types
http://support.microsoft.com/kb/948478
あるいは各アプリケーションの先頭で明示的に Culture を指定してしまうとか。
Conversion from string "0" to type 'Integer' is not valid.
http://social.msdn.microsoft.com/Forums/eu/vbgeneral/thread/6246fab6-74db-4b18-a0ba-2c5d5d686294
# 誰か他のところで地域と言語の設定をいじくっていたりするんでしょうか。 -
totojo様
回答ありがとうございます。
取り急ぎ、レジストリのキーに異常値が設定されていないか、
及び、地域と言語のオプションの設定が他言語になっていないかを確認してみましたが、
特に問題となるような状況は確認できませんでした。
現象が発生しているタイミングで再確認してみます。
とはいえ、突然発生・自然回復といった状況の為、そもそもいつ現象が発生するかわからず、いつになる事やら・・・
頂いた情報や、発生している現象から推測すると、あるタイミングで、言語設定かエンコードのような設定が一時的に変更?されてしまった結果、発生している。といった感じなのでしょうか・・・
-
どういうアプリケーションなんでしょうか。
常駐していてスレッドが増えないアプリケーションなら、そのスレッドの CultureInfo が書き換わるイメージがなかったので気になりました。
たとえば、定期的にタスクで立ち上がるアプリケーションであるとか、CInt とか操作しているのは毎回新しいスレッドが作られているとか、そういった場合は可能性があり得るかなとは思えますが…。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
それぞれの機能毎にEXEファイルを作成し、メニューからそのEXEを呼び出しております。(クラス実行)
一旦現象が発生すると、それらの複数の機能において、CInt系の処理がことごとくエラーとなっています。書式設定はスレッドごとに保持されています。
アプリケーションを都度起動するような構成だとすると、もしも書式設定が書き換わる何かがあれば、その機能を実行したときの設定を保持し続けるのでその EXE を再起動しない限りはエラーになるのでしょうね。現象がどうしても押さえ込めないのなら、起動時に Thread.CurrentThread.CurrentCulture とか CurrentUICulture とかを特定の CultureInfo で上書きしてしまうとかもありかなぁ。(あくまで回避、対症療法です)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。