web-dev-qa-db-ja.com

DBNull.Valueと空のテキストボックス値をデータベースに渡す

私のページにはオプションのテキストボックスがいくつかあり、このDALコードがあるため空にすることができます

parameters.Add(new SqlParameter("@FirstName", FirstName));
parameters.Add(new SqlParameter("@LastName", LastName));
parameters.Add(new SqlParameter("@DisplayName", DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate));
parameters.Add(new SqlParameter("@Gender", Gender));

これらのフィールドはどれも空にすることができます。問題は、それらが空のときにProcedure XXX requires @FirstName which was not suppliedを受け取ることです。

次に、コードをに変更しました

parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName));
parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName));
parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value));
parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender));

しかし、これは私には厄介に見えます。特にobjectへのキャストは、3項ステートメントで両方の値が同じ型である必要があるためです。

データベースで空の文字列またはnull文字列がNULLとして扱われないのはなぜですか?これをDBNull.Valueに変換する必要がある場合、よりクリーンな方法はありますか?値を空の文字列としてデータベースに保存すると役立つ場合がありますが、データベースでNULLをクエリすると面倒になります

一般的な慣行またはそれに近いことについてアドバイスをお願いします。

11
codingbiz

まず、さらに2つの便利なオーバーロードがあります。

command.Parameters.Add("@name").Value = value;

または

command.Parameters.AddWithValue("@name", value);

個人的には、次の拡張方法を使用します。

public static object DbNullIfNull(this object obj)
{
    return obj != null ? obj : DBNull.Value;
}

command.Parameters.AddWithValue("@name", value.DbNullIfNull());

または

public static object DbNullIfNullOrEmpty(this string str)
{
    return !String.IsNullOrEmpty(str) ? str : (object)DBNull.Value;
}
11
abatishchev

少しリファクタリングすると、コードの煩雑さが軽減される可能性があります。これを試して

dbParams.Add(SetDBNullIfEmpty("@FirstName", FirstName));
dbParams.Add(SetDBNullIfEmpty("@LastName", LastName));
dbParams.Add(SetDBNullIfEmpty("@DisplayName", DisplayName));
dbParams.Add(SetDBNullIfEmpty("@BirthDate", BirthDate));
dbParams.Add(SetDBNullIfEmpty("@Gender", Gender));

private SqlParameter SetDBNullIfEmpty(string parmName, string parmValue)
{
    return new SqlParameter(parmName, String.IsNullOrEmpty(parmValue) ? DBNull.Value : (object)parmValue));
}
5
naveen

ストアドプロシージャのパラメータをデフォルトにして、オプションにすることができます。

create procedure XXX
(
   @FirstName nvarchar(50) = null,
   @LastName nvarchar(50) = null,
   ...
)
2
Mufaka