2011-12-08 8 views
9

CzyDataReader [i] vs DataReader.GetValue (I) vs DataReader.GetString (I)

dataReader[i] 

logicznie równoważne

dataReader.GetValue(i) 

są one takie same? Czy oni są inni? Czy istnieje sytuacja, w której jeden byłby odpowiedni w stosunku do drugiego?

Istnieje documented differently:

  • Pobiera kolumnę pod wskazanym indeksem
  • Zwraca wartość określonej dziedzinie.

Ale kiedy z nich korzystać oboje zwracają wartość pola. Co to znaczy "zdobyć kolumnę"? Co to znaczy "zwrócić wartość pola"?


Bonus Czatujący:

Kiedy zadzwonić:

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

dostaję String każdorazowo

Odpowiedz

15

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.

+0

Istnieją okropne przypadki skrajne, w których 'GetValue' zwraca' bajt', ale 'GetInt32' nie jest w stanie przesłać bajtu do Int32 –

+0

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ź. –

+0

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. –

Powiązane problemy