C#クラスメソッドで使用しているオプションの入力パラメーターがいくつかあります。オプションの構文は、パラメーターが使用されていない場合に「0」の値を作成するため、メソッドで呼び出すSQL挿入コマンドは、そのようなものとして挿入を完了します。ただし、パラメーターが使用されていないときに、0ではなくNULL値を挿入するコマンドが必要です。大量の「if」ステートメントを使用せずにこれを実現する最良の方法は何ですか?
以下は私が参照しているコードです。 SqlParameter宣言でNULL値を指定できる構文/コマンドはありますか?
public int batchInsert
(
int id,
int outcome,
int input = 0,
int add = 0,
int update = 0,
int delete = 0,
int errors = 0,
int warnings = 0
)
{
string sts;
if (outcome == 0)
{
sts = "S";
}
else if (outcome == 1)
{
sts = "W";
}
else
{
sts = "E";
}
SqlConnection sqlConn = new SqlConnection(this.connString);
SqlParameter runId = new SqlParameter("@runId", id);
SqlParameter endTime = new SqlParameter("@endTime", DateTime.Now);
SqlParameter status = new SqlParameter("@status", sts);
SqlParameter sqlInput = new SqlParameter("@itemsRead", input);
SqlParameter sqlAdd = new SqlParameter("@add", add);
SqlParameter sqlUpdate = new SqlParameter("@update", update);
SqlParameter sqlDelete = new SqlParameter("@delete", delete);
SqlParameter sqlError = new SqlParameter("@errors", errors);
SqlParameter sqlWarning = new SqlParameter("@warnings", warnings);
SqlParameter result = new SqlParameter("@outcome", results[outcome]);
SqlCommand sqlComm = new SqlCommand(insertCommand(), sqlConn);
はい、パラメータの値にはDBNull.Value
を使用してください。例えば:
SqlParameter sqlError =
new SqlParameter("@errors", errors == 0 ? (object)DBNull.Value : errors);
または、少しヘルパーを書きます:
private object ValueOrDBNullIfZero(int val) {
if ( val == 0 ) return DBNull.Value;
return val;
}
次に:
SqlParameter sqlError =
new SqlParameter("@errors", ValueOrDBNullIfZero(errors));
これは、SQLパラメータにNull値を割り当てる最も簡単な方法です。
command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);
各パラメータ値を確認し、DBNull.Value
send nullを使用する必要があります。これを少し簡単にするためにobject
からの拡張メソッドがあります。
public static class ObjectExtensions
{
public static object OptionalParam<T>(this T value, T optionalValue = default(T))
{
return Equals(value,optionalValue) ? (object)DBNull.Value : value;
}
}
使用法:
var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam());
または、デフォルト以外の任意の値をデフォルト値として検討する場合:
var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam(-1));
Nullable(T) 構造の使用を検討してください。値がある場合にのみ設定でき、SQLコマンドオブジェクトはnull許容値を認識し、それに応じて面倒なく処理されます。
必要なときにnull日時パラメーターを設定するもう1つの明確な方法
if(obj.myDate == DateTime.MinValue)
{
aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = DBNull.Value;
}
else
{
aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = obj.myDate ;
}
小さなヘルパークラスを使用して、DBNull.Valueをsqlparameterに追加する拡張メソッドを作成できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Data.Common;
namespace System.Data.SqlClient
{
public static class ExtensionMethods
{
public static SqlParameter AddParameter(this SqlParameterCollection parms, SqlParameter param)
{
if (param.Value == null)
{
param.Value = DBNull.Value;
return parms.Add(param);
}
else
{
return parms.Add(param);
}
}
}
使用法
SqlParameter _FraudPackageID = new SqlParameter("@FraudPackageID", System.Data.SqlDbType.BigInt);
_FraudPackageID.Value = FraudPackageID;
_FraudPackageID.Direction = System.Data.ParameterDirection.Input;
_cmd.Parameters.AddParameter(_FraudPackageID);
値としてnullをsqlparameterに割り当てるか渡すと、この拡張メソッドはそれを自動的にDBNullに変換し、sqlparameterに再度割り当てます。
したがって、動的に渡す値について心配する必要はありません。
短い構文!
cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" } );