SqlCommandのParametersの値に、Nullを入れる
まずは例から。
string _name = ""; (途中略) SqlCommand cmd = cn.CreateCommand(); cmd.Parameters.Add("name", SqlDbType.NVarChar).Value = _name;
このような場合、_nameが空の際にはParameterにはNullを入れたいと仮定します。
そこで通常、以下のようなコードを最初に想像しました。
cmd.Parameters.Add("name", SqlDbType.NVarChar).Value = _name!="" ? _name : DBNull.Value;
しかしこれだとデータ型をNull→stringに変換できないとエラーが出ます。
そこで以下のように置き換えるようです。
cmd.Parameters.Add("name", SqlDbType.NVarChar).Value = _name!="" ? _name : System.Data.SqlTypes.SqlString.Null;
また、ここではstringのNullを使ってますが、DateTimeやint等の場合も「System.Data.Sql〜」の箇所を置き換える事で可能です。
追記:DateTimeのNullについて
DateTimeの場合には注意が必要なようです。
DateTime _date = 1999; cmd.Parameters.Add("published", SqlDbType.DateTime).Value = _date.Year < 2000 !="" ? _date : (DateTime)System.Data.SqlTypes.SqlDateTime.Null;
上記は「2000年より前の場合にはNullを入れる」処理を示してますが、
このようにすると、パラメータ「published」には「1900/01/01」が入ってしまいます。
理由は、System.Data.SqlTypes.SqlDateTime.Null=「1900/01/01」だからです。
つまり先述のstringと同じ方法でNullを入れる事はできないのです。
ひとまず代替案(になってませんが)として、以下のように書きました。
if(_date.Year < 2000) { cmd.Parameters.Add("published", SqlDbType.DateTime).Value = DBNull.Value; } else { cmd.Parameters.Add("published", SqlDbType.DateTime).Value = _date; }