12

ページにいくつかのテキストボックスがありますが、それらはオプションであり、この 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しかし、三項ステートメントでは両方の値が同じ型である必要があるため、これは特にキャストが面倒に見えます。

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

一般的な慣習やそれに近いものについてアドバイスをお願いします。

4

3 に答える 3

13

まず、さらに 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;
}
于 2012-09-16T07:05:33.760 に答える
5

少しリファクタリングするだけで、コードがすっきりするかもしれません。これを試して

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));
}
于 2012-09-16T06:27:26.623 に答える
2

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

create procedure XXX
(
   @FirstName nvarchar(50) = null,
   @LastName nvarchar(50) = null,
   ...
)
于 2012-09-16T04:21:37.837 に答える