SqlServerのVarBinary(max)型にnull(Visual BasicだとNothing)を登録するのに苦労しました。
【ケース1】
sqlCommand.Parameters.AddWithValue("@paramName", null);
上記のコードは実行時に@paramNameに値がセットされていません。といった内容の
エラーが発生してしまいます。
パラメータに直接nullをセットすることはできません。
【ケース2】
sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);
そんなわけでnullをSystem.DBNull.Valueに書き換えたのですが、
VarBinary型に登録しようとすると実行時にエラーが発生します。
「nvarchar データ型から varbinary(max) データ型への暗黙の変換は許可されません。CONVERT 関数を使用して、クエリを実行してください。」
ただ、上記のようなコードがどんな場合でも実行時エラーになる訳ではないのです。
2-1: VarChar型に登録
[成功] sqlCommand.Parameters.AddWithValue("@paramName", "登録したい文字列");
[成功] sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);
2-2:VarBinary(max)型に登録
// byteArrayValueはSystem.Byte[]の変数。
[成功] sqlCommand.Parameters.AddWithValue("@paramName", byteArrayValue);
[失敗] sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);
【ケース3】
SqlParameter param = sqlCommand.Parameters.Add("@paramName", SqlType.VarBinary);
param.Value = System.DBNull.Value;
上記のコードでようやくVarBinary型にnullを登録することができました。
わかってしまえば何のことはない、パラメータの型指定をしてしなかっただけです。
(型指定しなかった場合にSystem.DBNull.Valueはnvarchar型と判断されてしまうのでしょうか。)
しかし、【ケース2】のエラーがたまに発生するから修正してと言われ、
膨大な量のプログラムから原因を探し当てるのは一苦労でした。
しかも、最初に書いた人のプログラムを真似したのか、
パラメータに名前と値しかセットしていないコードがあちこちに増殖していて
結局全部直す羽目になってしまいました。
パラメータの型指定はちゃんとしておきましょう・・。