Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

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; }