2011-07-15 16 views
3

私は、SQL Server 2008のデータベースからスカラー値を返すいます:?演算子とNULL値を扱う

string reason = cmd.ExecuteScalar().ToString() ?? : ""; 

私はreason = ""ないヌルこと、nullが返された場合ことを確認します。

私はこのライン上のエラー取得しています:

エラー3無効な表現用語 ':' これを固定することができますどのように

を?

EDIT:

は今、私は同じ行にこの例外を取得しています、コロンの変更をお願い致します:

string reason = cmd.ExecuteScalar().ToString() ?? ""; 
System.NullReferenceException occurred 
    Message="Object reference not set to an instance of an object." 
+3

を使用??'、 'ありません? : '。 – zneak

+1

結果がNULLの場合、それでも例外が発生するため、単純な解決策はデータベース内の値をNULLにすることができないようにすることです。別の簡単な解決策は、データベースに格納されている値がString型に設定されていることを確認することです。つまり、nullが発生しても例外は発生しません。 C#では値を持たないStringは空の文字列です。文字列変数のデフォルト値はnullで、コンソールウィンドウに表示された場合は空の文字列またはヌル文字になります(何も印刷されません)。 –

+0

下記の私の答えを見てください(特に最後の部分)。 – canon

答えて

10

:あなたは複数行にオフに分割する。このくらいの方が良いと思いますそのNULL値の.ToString()を呼び出すことによってヌル参照例外が発生する......

だから、??演算子は本当にここでお手伝いしていないと思います... "usua l "ダンス:

object result = cmd.ExecuteScalar(); 

if(result != null) 
{ 
    reason = result.ToString(); 
} 
else 
{ 
    reason = "(NULL value returned)"; 
} 
+2

'string reason =(cmd.ExecuteScalar()?? String.Empty).ToString();'は動作しますか?とにかく、唯一の正しい答えを持っているために+1(または少なくとも1分前まで...) – Ryan

+0

同じことがあった - 意味がありません。元の質問は ':'を削除することで説明されていたため、OPを編集して、ほとんどの回答を無効にしました - ゴールポストを動かした場合。私はちょうど私の答えを削除し、ダウン投票している人は走ってジャンプすることができます! – cristobalito

+0

@marc、あなたは正しく欠陥を指摘します、あなたは正しく指摘していますか?単独では問題を解決できません。しかし、ソリューションを提供していないため、あなたが「*正しい答え」を持っていると誤解しています!あなたは同意しますか? –

2

がちょうどコロンを取り除きます。

string reason = cmd.ExecuteScalar().ToString() ?? ""; 

MSDN pageを参照してください。

+5

- しかしこれはまだ**失敗します.'ExecuteScalar()はNULLを返します。あなたの '.ToString()'は既にNull参照例外を引き起こしています...... –

+0

確かに私がこの質問に答えた時に、「この構文エラーをどうやって修正するの? – Coeffect

+0

@Mannimacro - あなたの答えが間違っていることを除いて。これは単純に異なるエラーを生成します。 –

2

nullで合体演算子を使用するときは、コロン必要はありません。... NullReferenceExcpetionがとにかくスローされます)

他人がが指摘したように
string reason = cmd.ExecuteScalar().ToString() ?? ""; 

、ToStringメソッド(だからここでは何も得られない。 .ExecuteScalar()NULLを返した場合、あなたはすでにしているので、このそれでも失敗します。

string reason = cmd.ExecuteScalar().ToString() ?? ""; 

しかし:これは試してみてください

var result = cmd.ExecuteScalar(); 
string reason = result == null ? "" : result.ToString(); 
8

まず、次のようなものは使用しないでください。オペレーター。

第二に、あなたがエラーを取得せずに、ここでやろうとしている何をするために、あなたは違っそれを実行する必要があります。

object objReason = cmd.ExecuteScalar(); 
string reason = objReason == null ? "" : objReason.ToString(); 

、これはあなたの戻り値がnullであるかどうかをチェックし、それがある場合2行目は理由を空文字列に設定し、それ以外の場合は返された値を使用します。

5

ExecuteScalar()nullとなる可能性がありますので、と表示される場合は、.ToString()に電話をかけてはいけません。

string reason = Convert.ToString(cmd.ExecuteScalar()); 

Convert.ToString()null

string.Emptyから

またはあなたは本当にそれのようなので、あなたが??を使用する必要がある場合は変換されますので、これは動作します:あなたが混乱している

(cmd.ExecuteScalar() ?? (object)"").ToString(); 
+0

特に、 'Convert.ToString(object obj)'は空文字列にnullを変換します。 'Convert.ToString(null)'は実際にnullを返します。 –

2

? conditional operator、その見た目の構文構文は次のようである?? null-coalesce operator

String x = condition ? valueIfConditionIsTrue : valueIfConditionIsFalse; 

String x = possiblyNull ?? valueIfPossiblyNullIsNull; 

をだから、離れてすべてのことから... これはあなたが本当にをしたい部分である:

String reason = (cmd.ExecuteScalar() ?? "").ToString(); 
このようなS

これは、ToString()がヌル参照例外の原因となっていた例外を処理します。

1

ちょうどそれが `ばかりだ

string reason = cmd.ExecuteScalar() ?? ""; 
+2

'ExecuteScalar()'は型 'オブジェクト'を返します。結果として、あなたのアプローチは、コンパイル・エラーを引き起こします。「暗黙のうちに、型オブジェクトを「string」に変換できません。」 –