4

このコードは私にとって非常にうまく機能します:

if (someStr == null)
  da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = DBNull.Value;
else
  da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr;

しかし、私の直感は、それのワンライナーバージョンがあるかもしれないと私に言います。何かのようなもの:

  da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : someStr ;

DBNull.Valueしかし、上記で投稿したワンライナーは、Stringにキャストされないため、もちろん失敗します。

私が望むワンライナーを達成する方法はありますか?

4

5 に答える 5

6

someStrをオブジェクトにキャストできます

例えば:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : (object)someStr;

または、OdedとServyが提案したように実行し、拡張メソッドを使用することもできます。数行のコードが追加される場合がありますが、コードの重複を防ぐことができます。

Servyが指摘したように、それを装着するobjectと混乱につながる可能性があります。このため、私はそれを着ますSqlParameter

public static void SetValue(this SqlParameter parameter, object value)
{
    parameter.Value = value == null ? DBNull.Value : value;
}

その後、そのように使用します

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).SetValue(someStr);
于 2012-10-19T19:27:24.040 に答える
4

テストを実行し、必要に応じて割り当てを行う関数または拡張メソッドを作成します。someStrパラメータ名を渡します。

これで、パラメーターを 1 行で設定できるようになります。

于 2012-10-19T19:21:02.293 に答える
4

次の拡張メソッドを使用できます (または、必要に応じて非拡張メソッドにすることもできます)。

public static object ConvertNull(this object obj)
{
    return obj ?? DBNull.Value;
}

その後、次のことができます。

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr.ConvertNull()
于 2012-10-19T19:23:58.747 に答える
2
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = ((object)someStr) ?? DBNull.Value; 
于 2012-10-19T19:34:23.977 に答える
0

挿入用のストアド プロシージャを記述し、引数のデフォルト値を null に設定し、そのストアド プロシージャを挿入コマンドに使用してから、その引数をその sproc に渡すだけではありません。

于 2012-10-19T19:36:39.177 に答える