2009-03-06 17 views
6

類似の質問がありましたが、回答は私が探していたものではありませんでした。参照がNULLまたは値がまだ割り当てられていない場合は、NULLの値をSQL Serverデータベースに挿入します。現時点ではnullをテストしているようです。.Net変数値からNULL値をSQL Serverデータベースに挿入します。

String testString = null; 

if (testString == null) 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", DBNull.Value); 
} 
else 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", testString); 
} 

これは私には信じられないほどに不器用です。私はデータベースに挿入するかなりの値を持っており、上記のようなすべてをテストするのは非常に冗長です。 .Netは何らかの方法でこれを処理しませんか?私はStringとは違って文字列を使用していても動作するようには思われません。周りを見回すと、Nullable型の使用に関する記事が見つかりました。

System.Nullable<T> variable 

これはプリミティブ、int?、charに対して機能するようです。ダブル?ブール?だから、それは文字列はどうですか?私はここで何かを逃していますかプリミティブ値と文字列値にどのような型を使用して、値を挿入する前に繰り返し値をテストする必要はありません。

編集: 前に、3値演算子に関する回答が多すぎます。私はそれらが好きですが、この文脈ではありません。その値をテストし、余分なロジックを持つ必要があるのは当然のことではありません。そのようなことが.Netフレームワークでは下位に実装されている可能性があります。無料で。

編集: さて、みんな私の攻撃計画を策定するのを助けます。私は私のプリミティブ(int?、double?など)にNullableを使用し、StringはStringを使用しますが、Stringは使用します。テスト。これは物事をより冗長に保ちます。私がここで紛失しているものがありますか?おそらくいくつかのセマンティクスを失うでしょうか?

答えて

11

二重疑問符(??)演算子は三項よりも優れています。最初の非NULL値をとります。だから、:

string x = null; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

はあなたにDBNull.Valueの値を持つPARMを与えるだろうが、

string x = "A String"; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

はあなたの値として「文字列」とPARMを与えるだろう。

+1

コンパイラは、暗黙的にstringからDBNullに変換できないため、この問題を抱えています。 – LukeH

+0

あなたは正しいです。文字列(x)をオブジェクトにダウンキャストする必要があります。編集された例。 –

+0

.Netがパラメータの間違った型を推測するのが容易になるので、これのファンではありません。 'SqlDbType'列挙型を要求するオーバーロードを介してパラメータ型を指定する方が良いでしょう。 –

0

多分三項演算子はあなたが有用であると思われるものです。私は時々何

0

は、このです:

command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value; 

if(String.IsNullOrEmpty (theString) == false) 
{ 
    command.Parameters["@column"].Value = theString; 
} 
3

のNullableは、プリミティブのために素晴らしい作品。私は文字列の動作をテストするつもりだが、少なくともあなたのコードをクリーンアップするためのオプションは、文字列の拡張メソッドを定義することだ。

??文字列の演算子:

command.Parameters.AddParameter(新しいSqlParameter( "@列"、myNull ??(オブジェクト)DBNull.Valueの)、それがnullでない場合は最初の項目を返す??

、他の賢明なことは、2番目の項目を返します。

編集、それはあなたがオブジェクトにDBNull.Valueのをキャストする必要がコンパイルされますので、

は上記のコードを修正しました。

+0

コンパイラは、暗黙的にstringからDBNullに変換できないため、この問題を回避します。 – LukeH

+0

私はあなたがtestStringを使うことができると信じていますか? (文字列)DBNull.Value。 –

+0

((オブジェクト)testStringについて)?? DBNull.Vale – recursive

0

私はそれが不器用で、そのビット不幸なことに同意しますSqlParameter.ValueはDbNull.Valueに設定する必要がありますが、あなたがnullのためのテストをしなければならないので、eはそれの周りにありません。

0

Nullable<T>は、参照型で値型ではないため、Stringには適用できません。

+0

こんにちは。ちょうどそれを見て、それは文字列がまだ参照型ではなく、失望しています。どうやらそれはエイリアスですが、例えば文字列a = "hello";文字列b = "h"; b + = "ello"; a == bは、それらの値を比較するため、trueを返します。面白い。 – uriDium

+0

Yes&No - 文字列が参照型であり、値型ではない理由は十分です(Jon Skeetのものを参照してください)。あなたが指定したようなケースでは、なぜ彼らはStringBuilderクラスを作成したのですか? –

0

例:

if (txtDisplayName.Text != "") 
{ 
    insert into table (id,display_name) values ('" + txtID.Text + "','" + txtDisplayName.Text + "'); 
} 
else 
{ 
    insert into table (id) values ('" + txtID.Text + "'); 
} 

これはnullを挿入します。

+0

こんにちは、スタックオーバーフローへようこそ!これは不完全なコードスニペットです。 – Jesse

関連する問題