Ostatecznie zależy to od konkretnej implementacji System.Data.IDataReader
masz na myśli , ale załóżmy, że masz na myśli System.Data.SqlClient.SqlDataReader
.
W tym przypadku, reader[i]
i reader.GetValue(i)
do dokładnie to samo. W rzeczywistości reader[i]
wewnętrznie wywołuje reader.GetValue(i)
. (Możesz to zobaczyć, rozmontowując kod za pomocą narzędzia takiego jak ILSpy.). Oba te elementy zwracają wartość w i-tej kolumnie bieżącego wiersza i zwracają się pomyślnie niezależnie od typu wartości (typem powrotu jest object
). Dokumentacja obu tych członków jest trochę myląca i mogłaby być lepiej sformułowana. Możesz użyć dowolnego z tych członków, gdziekolwiek chcesz, po prostu wybierz ten, który uważasz za lepszy.
Podczas gdy reader.GetString(i)
jest specjalnie zaprojektowany do zwracania wartości zawartej w i-tej kolumnie bieżącego wiersza jako string
. Jeśli wartość w tej kolumnie nie jest równa string
, zostanie wygenerowany InvalidCastException
. Użyj tej metody, gdy masz pewność, że wartością jest string
i string
jest typ, z którym chcesz pracować. Dzięki temu Twój kod stanie się bardziej zwięzły, ponieważ nie będziesz musiał wykonywać rzutowania.
W konkretnym przypadku wartość w i-tej kolumnie bieżącego wiersza musi być typu string
, dlatego zwracana wartość wszystkich trzech elementów jest identyczna.
Zapisane poprawnie, inne implementacje System.Data.IDataReader
powinny zachowywać się w taki sam sposób.
Istnieją okropne przypadki skrajne, w których 'GetValue' zwraca' bajt', ale 'GetInt32' nie jest w stanie przesłać bajtu do Int32 –
Trudno powiedzieć (zwłaszcza, że zdemontowany kod jest trudny do wykonania), ale wydaje się, że wartość w kolumnie musi już być pożądanego typu, w przeciwnym razie zostanie zgłoszony wyjątek InvalidCastException (który sam jest trochę mylący). Będę edytować odpowiedź. –
Rzeczywiście, dokumentacja dla GetInt32 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx) stwierdza, że "Nie są wykonywane żadne konwersje, dlatego też pobrane dane muszą już 32-bitowa liczba całkowita ze znakiem ". Inne metody GetXXX są podobnie udokumentowane. –