はじめに
これは、本番環境などでやらかしちゃった人 Advent Calendar 2025 と Visual Basic Advent Calendar 2025の17日目のクロス投稿の記事となります。
突貫工事で作成
2021年12月に突貫工事のごとくアプリケーションの作成依頼がきました。
工場で動かしているシステムではローカル上にデータが保存されるのですが、インターフェイスと呼ばれるプログラムにパラメータを渡すことで、サーバーにアクセスして認証したり実績データをDBに格納したりと 8つのコマンドが用意されています。
サーバー側はIIS + Classic ASP(VB) + PosgreSQLという構成です。
今回作成するアプリケーションはそのインターフェイスの縮小版、認証コマンドなどは何が入ってもOKを返す、見える化が目的で実績データをDBに格納するというもので実質コマンドは2つのみとなります。
DBに格納するテーブルも新たに再構築し機能別に分かれていたテーブルを統合しました。
サーバー側の構成は同じ、久しぶりのClassic ASP(VB)による開発です。
クライアント側プログラム(C#)は同じものを使用、設定でIISのエイリアス名を切り替えるだけとなります。
従来使用していたロットシリアル(英数字36進数+連番の独自仕様)という採番も、他の機能と連携する必要がないため、PostgreSQLのシーケンスを採用することにしました。
1日多くて2000件なので、32bit値(2,147,483,647)あれば100万日、全然余裕があります。
構想から2週間後(2021/12/20)、仕様の行き違いが少しありましたが修正して無事に本番導入されました。
年の瀬もあり、しばらく検証しながら使用して頂くことになりました。
本番導入から数ヶ月後
約5ヶ月経過した 2022/05/17 9:00に出社すると 07:16:23以降からエラーが出て連動を切ったと工場から報告がありました。
工場は稼働が最優先であり、生産ができなくなるのは大問題です。インターフェイスに問題があって動かない場合、非連動に切り替えることができます。もちろんその間の実績データはDBに格納されません。
工場のサーバーにリモートで入りエラーのログを見ると...
エラー '800a0006' オーバーフローしました。: 'CInt'
PostgreSQLのシーケンスは、32768 になっていました。
原因
エラー箇所の'CInt'の部分です。
ロットシリアルの値が32768となり、CIntの変換でオーバーフローとなりました。
Public Sub GetLotSerial(ByRef retCode, ByVal key)
If CInt(RS("LOTSERIAL")) <> 0 Then
普段はC#で開発していたため、すっかり忘れていたのですが、Classic ASP(VB)の Integer型は、まだ16bitでした。
| 型 | 最小値 | 最大値 |
|---|---|---|
| Integer | -32768 | 32767 |
| Long | -2147483647 | 2147483648 |
対応
変換型をLong型に変更する。
Public Sub GetLotSerial(ByRef retCode, ByVal key)
If CLng(RS("LOTSERIAL")) <> 0 Then
実際はこれだけじゃなく、上長からLong型でも最大値を超えた場合のエラー処理まで作成するように指示がありました。
テスト仕様書にも、採番の最大値を超えた場合のテストが追加されました。
反省
採番の最大値を超えた場合というテストはまったく考慮していなかったです。
32bit値(2,147,483,647)あれば100万日、全然余裕でしたからね。
最後に
後から知ったのですが、まだ試験運用中だったのです。そのため大事にはならなかった。
ちなみに、2024年からのWindows Server 2022へのサーバー切り替え時にともない、Classic ASP(VB)で作成されたアプリケーションは、ASP.NET(C#)およびBlazor Serverに作り替えました。