2011-12-08 7 views
9

DataReaderの[i]を

dataReader.GetValue(i) 

と論理的に等価

dataReader[i] 

です彼らは同じですか?彼らは違いますか?誰かが適切である状況がありますか?

documented differentlyあります

  • は、指定されたインデックス
  • 戻る指定したフィールドの値にある列を取得します。

が、私はそれらを使用する場合、それらの両方が、フィールドの値を返します。 「列を取る」とはどういう意味ですか? 「フィールドの価値を返す」とはどういう意味ですか?


ボーナスびびり:私は呼ん

reader[i]; 
reader.GetValue(i); 
reader.GetString(i); 

私はString

答えて

15

は最終的に、それはあなたが参照しているSystem.Data.IDataReaderの特定の実装に依存するたびに取得しますしかし、あなたはSystem.Data.SqlClient.SqlDataReaderを意味すると仮定しよう。

この場合、reader[i]reader.GetValue(i) do 正確にはと同じものです。実際にはreader[i]は内部でreader.GetValue(i)と呼び出しています。 (ILSpyのようなツールを使ってコードを逆アセンブルすると分かります)。これらのメンバーは両方とも、現在の行のi番目の列の値を返し、値の型に関係なく正常に戻ります(戻り値の型はobject)。これらのメンバーの両方のドキュメントは少し誤解を招きやすく、より良い方法で言葉で表現することができます。あなたは好きなところで、これらのメンバーのどちらかを使うことができます。ちょうど良いと感じるものを選んでください。

reader.GetString(i)は、現在の行のi番目の列に含まれる値をstringとして返すように特別に設計されています。その列の値がstringでない場合は、InvalidCastExceptionがスローされます。値がstringで、作業するタイプがstringであることが確かである場合は、このメソッドを使用します。これは、キャストを実行する必要がないので、コードをより簡潔にします。

特定のケースでは、現在の行のi番目の列の値は、stringの型でなければなりません。そのため、3つのメンバーの戻り値はすべて同じです。

正しく書かれている場合、System.Data.IDataReaderの他の実装も同じように動作するはずです。

+0

'GetValue'は' byte'を返しますが、 'GetInt32'はバイトをInt32にキャストできません –

+0

(特に逆アセンブルされたコードは難しいので)カラムの値がすでに望ましいタイプである必要があります。そうでないと、InvalidCastException(それ自体が少し誤解を招く)がスローされます。私は答えを編集します。 –

+0

実際、GetInt32(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx)のドキュメントには、「変換は実行されないため、取得されるデータは、すでに32ビットの符号付き整数である必要があります。他のGetXXXメソッドも同様に文書化されています。 –

関連する問題