web-dev-qa-db-ja.com

SqlParameterにNULL値を割り当てる最良の方法

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);
17
NealR

はい、パラメータの値には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));
36
Eric Petroelje

これは、SQLパラメータにNull値を割り当てる最も簡単な方法です。

            command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);   
3
Parsa

各パラメータ値を確認し、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));
3
moribvndvs

Nullable(T) 構造の使用を検討してください。値がある場合にのみ設定でき、SQLコマンドオブジェクトはnull許容値を認識し、それに応じて面倒なく処理されます。

1
Dillie-O

必要なときに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 ;
}
0
daniele3004

小さなヘルパークラスを使用して、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に再度割り当てます。

したがって、動的に渡す値について心配する必要はありません。

0
kavali rakesh

短い構文!

  cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" }  );
0
GoAntonio