発端
あるシステムリプレースであったお話。
コードは大体こんな感じで、いたって普通なのにFill実行時に「指定されたキャストは有効ではありません。」とか言われる。
Public Function Fill(ByVal _sql As String, ByRef _cn As NpgsqlConnection) As System.Data.DataSet
Dim da As New NpgsqlDataAdapter
dim cmd As NpgsqlCommand
Dim ds As New System.Data.DataSet
cmd = New NpgsqlCommand(_sql, _cn)
da.SelectCommand = Me.m_cmd
da.Fill(ds)
da = Nothing
Return ds
End Function
解決
最初は「npgsqlのバグか?」とか思って最新版にしたりしたけど解決せず。
しかも検索結果を絞ると出たりでなかったり。
じゃやっぱりデータの方かと思ってよく見てみるとあるカラムに
10007-06-07
とかいう遠い未来がおった。
.NETのDate型はMAXで9999/12/31なのでこいつが原因でしたとさ。
経緯の方は
・前のシステム(COBOL)で日付型を使わず(っていうかない)に8ケタの数字を使ってた
・しかも未入力時に99999999を設定してた
・そんなデータがあるとは知らず旧システムからぶっこ抜いたデータを半自動で整形してポスグレに入れてた結果10007-06-07が誕生。
という感じ。
やっぱシステム移行には罠が多いねぇ。
あとあんま関係ないけどPostgreSQLって
select ('9999/99/99'::date)
はエラーになるける
select to_date('99999999','YYYYMMDD')
はエラーにならないんだね。