2011-01-18 4 views
0

この質問を投稿する前にいくつかの調査を行いましたが、データが返されないときにExecuteScalarがSystem.NullReferenceExceptionをスローするという事実を認識しています。そのため、私はストアドプロシージャを "return 1"に変更して戻り値が保証されているのです。しかし、私はまだNULL参照例外を取得しています。ExecuteScalarは、1を返すストアドプロシージャを呼び出すとNullReferenceExceptionをスローします

だから私は、データを持つテーブルを照会するためにSqlCommandオブジェクトを使用しようとしました:

 SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn) 

私はスカラーを実行実行したとき、私は私がデータベースを照会する権限を持って知っているので、値を拾うことができました。私はこれが私が逃したいくつかの特定の格納されたproc権限設定であると思われますか?

私は一日のうちにこれに固執していたので、本当にコメント/提案を感謝します。 :(

私のコードは次のようになります。

 using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
     { 
      sqlConnection.Open(); 
      using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection)) 
      { 
       sqlCommand.CommandType = CommandType.StoredProcedure; 
       //sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID)); 
       //sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */)); 

       byte retValue = (byte)sqlCommand.ExecuteScalar(); 
       return retValue; 
      } 
     } 

THANKS

+3

どのラインが例外を投げるのですか?スタックトレースはどこですか? – asawyer

+0

あなたは 'ExecuteScalar'の目的を理解していますか?データの最初の行の最初の列を返し、それ以外はすべて無視されます。あなたが 'SELECT * 'と共にそれを使用している理由はありますか? –

答えて

2

ランダム推測

の列1、行1を読むためのデータセットは無いので、あなたはRETURNを使用しています! ExecuteScalar

SELECTまたはOUTPUTパラメータを使用

編集:

RETURN 1実は、それほどランダムではないが、結果セットではありません:それは「特別な」パラメータ

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue 
+0

ありがとう!それはうまくいった。私の元のストアドプロシージャは実際に結果セットを返しますが、デバッグの目的で私はデバッグに役立つだろうと思って変更しましたが、実際に私を完全に脱線させました。私は非常に不満を覚えていたので、デバッグプロセス全体を開始した私の元のストアドプロシージャの小さなタイプミスが間違っていました。 :(とにかく、もう一度ありがとう! – Bryan

3

だ私はちょうど@gbnが言ったことについて詳しく説明するつもりです。 SQLコードを実行すると、OUTPUTのパラメータ、表形式のデータ、および/またはRETURNの値の3つの異なる方法で情報を返すことができます。 @ gbnと同様に、RETURNの値は基本的にはOUTPUTのパラメータに特化しています。 ExecuteScalarは、表形式のデータ、つまり最初の行の最初の列の情報のみを表示します。 ExecuteScalarを呼び出すときに表データが受信されない場合は、代わりにnull値が返されます。このヌル値で何かしようとすると、明らかにNREが得られます。

+0

良い説明、ありがとう – gbn

関連する問題