私のページにはオプションのテキストボックスがいくつかあり、この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
をクエリすると面倒になります
一般的な慣行またはそれに近いことについてアドバイスをお願いします。
まず、さらに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;
}
少しリファクタリングすると、コードの煩雑さが軽減される可能性があります。これを試して
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));
}
ストアドプロシージャのパラメータをデフォルトにして、オプションにすることができます。
create procedure XXX
(
@FirstName nvarchar(50) = null,
@LastName nvarchar(50) = null,
...
)