2012-02-02 18 views
2

sqlParametersのリストを作成し、ストアドプロシージャに渡すコードブロックがあります。入力テキストボックスが空白であるかどうかに基づいて条件付きで値のいくつかをnullにする必要がありました。条件付きでSqlParametersのリスト内の値がNULL

基本コード:

var SqlParams = new List<SqlParameter> { 
    new SqlParameter("@SomeFloat", SqlDbType.FLoat) {Value = f}, 
    .... 
} 

私が何かにいくつかのバリエーションを試してみましたが、それはうまくいきませんでしたし、VSは、フロートとヌルの間には暗黙的な変換に関するエラーが発生します。

new SqlParameter("@SomeFloat", SqlDbType.Float) {Value = (!string.IsNullOrEmpty(tb.Text) ? double.Parse(tb.Text) : DBNull.Value)}, 

モジュール全体を書き直す必要がないように、このパラメータリストを維持する方法はありますか?

おかげ

+0

あなたはDeriveParametersはを使用していないのはなぜ? –

答えて

4

ほとんどの場合、条件演算子がその結果を知っていることを確認するだけです。 double.ParseまたはDBNull.Valueのいずれかをキャストobject

また、ブラケットを削除して削除しやすくするために条件を入れ替えました。

new SqlParameter("@SomeFloat", SqlDbType.Float) 
    { 
     Value = string.IsNullOrEmpty(tb.Text) 
      ? DBNull.Value 
      : (object)double.Parse(tb.Text) 
    } 

は、しかし、私は通常、この

if (!string.IsNullOrEmpty(tb.Text)) 
    command.Parameters.AddWithValue("@SomeFloat", double.Parse(tb.Text)); 

ような何かを行うと、テキストボックスが空白の場合は、値を指定して、ストアドプロシージャがそのケースを扱うことはできないだろう。

+0

これは完璧です - ありがとう!私はこれを書き直したいと思いますが、いくつかのパラメータがあり、そのうち4つにこの条件が必要なので、データベースに影響を与えずにこの変更をノックアウトするより簡単な方法を探していました。 –

1

私は完全メソッドへの各呼び出しを指し、それがパラメータとして渡されることになるだろう値を決めるようにすることをお勧めします。

1

これは、拡張のために良いケースです:

public static object TryParseSqlValue(this object input) 
    { 
     if (null == input) 
      return DBNull.Value; 
     if (input.GetType() == typeof(string) && input.ToString() == string.Empty) 
      return DBNull.Value; 
     else 
      return input; 
    } 

myTextBox.Text.TryParseSqlValue(); // returns either the non-empty 
            // string or DBNull.Value 

あなたは他のデータ型のためにそれを修正することができます...

関連する問題