:このような何かを試してみてください。これは直感的なので、コースのSqlParameter値をnullに設定することは、SqlParameterCollectionからSqlParameter値を削除することと機能的に同等です。
このばかばかしいAPI設計エラーを修正するには、SqlParameterCollection、String(パラメータ名)、およびObject(パラメータ値)を取る独自のAddParameterメソッド(オーバーロードあり)を作成します。あなたが見ることができるように
#region Add by Name/Value.
/// <summary>
/// Adds an input parameter with a name and value. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="value">The value of the parameter to add.</param>
private static void AddParameter(SqlParameterCollection parameters, string name, object value)
{
parameters.Add(new SqlParameter(name, value ?? DBNull.Value));
}
/// <summary>
/// Adds a parameter with a name and value. You specify the input/output direction. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="value">The value of the parameter to add. If null, this is automatically converted to DBNull.Value.</param>
/// <param name="direction">The ParameterDirection of the parameter to add (input, output, input/output, or return value).</param>
private static void AddParameter(SqlParameterCollection parameters, string name, object value, ParameterDirection direction)
{
SqlParameter parameter = new SqlParameter(name, value ?? DBNull.Value);
parameter.Direction = direction;
parameters.Add(parameter);
}
#endregion
#region Add by Name, Type, and Value.
/// <summary>
/// Adds an input parameter with a name, type, and value. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="type">Specifies the SqlDbType of the parameter.</param>
/// <param name="value">The value of the parameter to add. If null, this is automatically converted to DBNull.Value.</param>
private static void AddParameter(SqlParameterCollection parameters, string name, SqlDbType type, object value)
{
AddParameter(parameters, name, type, 0, value ?? DBNull.Value, ParameterDirection.Input);
}
/// <summary>
/// Adds a parameter with a name, type, and value. You specify the input/output direction. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="type">Specifies the SqlDbType of the parameter.</param>
/// <param name="value">The value of the parameter to add. If null, this is automatically converted to DBNull.Value.</param>
/// <param name="direction">The ParameterDirection of the parameter to add (input, output, input/output, or return value).</param>
private static void AddParameter(SqlParameterCollection parameters, string name, SqlDbType type, object value, ParameterDirection direction)
{
AddParameter(parameters, name, type, 0, value ?? DBNull.Value, direction);
}
#endregion
#region Add by Name, Type, Size, and Value.
/// <summary>
/// Adds an input parameter with a name, type, size, and value. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="type">Specifies the SqlDbType of the parameter.</param>
/// <param name="size">Specifies the size of the parameter for parameter types of variable size. Set to zero to use the default size.</param>
/// <param name="value">The value of the parameter to add. If null, this is automatically converted to DBNull.Value.</param>
private static void AddParameter(SqlParameterCollection parameters, string name, SqlDbType type, int size, object value)
{
AddParameter(parameters, name, type, size, value ?? DBNull.Value, ParameterDirection.Input);
}
/// <summary>
/// Adds a parameter with a name, type, size, and value. You specify the input/output direction. Automatically handles conversion of null object values to DBNull.Value.
/// </summary>
/// <param name="parameters">SqlParameterCollection from an SqlCommand instance.</param>
/// <param name="name">The name of the parameter to add.</param>
/// <param name="type">Specifies the SqlDbType of the parameter.</param>
/// <param name="size">Specifies the size of the parameter for parameter types of variable size. Set to zero to use the default size.</param>
/// <param name="value">The value of the parameter to add. If null, this is automatically converted to DBNull.Value.</param>
/// <param name="direction">The ParameterDirection of the parameter to add (input, output, input/output, or return value).</param>
private static void AddParameter(SqlParameterCollection parameters, string name, SqlDbType type, int size, object value, ParameterDirection direction)
{
SqlParameter parameter;
if (size < 1)
parameter = new SqlParameter(name, type);
else
parameter = new SqlParameter(name, type, size);
parameter.Value = value ?? DBNull.Value;
parameter.Direction = direction;
parameters.Add(parameter);
}
#endregion
は、値がすでにオブジェクトとして型指定された方法(および過負荷)、内部で、私は強制する「値?? DBNull.Valueの」ステートメントを使用し、ヌル= DBNull.Valueをルール。
null値のオブジェクト参照またはnullのない型をAddParameterメソッドに渡すと、DBNull.Valueがクエリに渡される予想通りの直感的な動作が得られます。
私はパラメータが無視されるようにしたい場合、私はそれを追加せずにそれをnullに設定するので、APIがそのまま実装された理由を想像できません。私は最初にそれを追加しないか、SqlParameterCollectionから削除します。パラメータを追加してSETに値を設定しても(nullに設定されていても)、クエリでUSEDになると予想されます。null値を意味するnullが必要です。
パフォーマンス上の理由から「正しい」方法を実装していないと聞いたことがありますが、SqlParameterCollection.AddWithValueメソッドを呼び出すと、すべてがオブジェクトに変換されて、Nullableインスタンスはnoヌルオブジェクトへの値は、パフォーマンスヒットではないC#言語の本質的な部分です。 Microsoftはこれを実際に修正する必要があります。
出力パラメータとして使用しない限り、DbTypeプロパティを設定しないことを強くお勧めします。私は一度もそれを使って解決した無数の微妙なバグを見たことはありませんでした。 –