は最終的に、それはあなたが参照している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
の他の実装も同じように動作するはずです。
'GetValue'は' byte'を返しますが、 'GetInt32'はバイトをInt32にキャストできません –
(特に逆アセンブルされたコードは難しいので)カラムの値がすでに望ましいタイプである必要があります。そうでないと、InvalidCastException(それ自体が少し誤解を招く)がスローされます。私は答えを編集します。 –
実際、GetInt32(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx)のドキュメントには、「変換は実行されないため、取得されるデータは、すでに32ビットの符号付き整数である必要があります。他のGetXXXメソッドも同様に文書化されています。 –