DataReader [i] против DataReader.GetValue (i) против DataReader.GetString (i) - PullRequest
11 голосов
/ 09 декабря 2011

Есть

dataReader[i]

логически эквивалентно

dataReader.GetValue(i)

Они одинаковые? Они разные? Есть ли ситуация, когда один будет уместнее другого?

задокументировано по-разному :

  • Получает столбец, расположенный по указанному индексу
  • Возвращает значение указанного поля.

Но когда я их использую, они оба возвращают значение поля. Что значит «получить колонку»? Что значит «вернуть значение поля»?


Бонусная болтовня :

Когда я звоню:

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

я получаю String каждый раз

1 Ответ

16 голосов
/ 09 декабря 2011

В конечном итоге это зависит от конкретной реализации System.Data.IDataReader, на которую вы ссылаетесь, но давайте предположим, что вы имеете в виду System.Data.SqlClient.SqlDataReader.

В этом случае reader[i] и reader.GetValue(i) делают точно то же самое.Фактически, reader[i] внутренне вызывает reader.GetValue(i).(Это можно увидеть, разобрав код с помощью инструмента, подобного ILSpy .).Оба эти члена возвращают значение в i-м столбце текущей строки и будут возвращаться успешно независимо от типа значения (тип возвращаемого значения object).Документация для обоих участников немного вводит в заблуждение и может быть сформулирована лучше.Вы можете использовать любой из этих элементов в любом месте, просто выберите тот, который, по вашему мнению, читается лучше.

Принимая во внимание, что reader.GetString(i) специально предназначен для возврата значения, содержащегося в i-м столбце текущей строки, в видеstring.Если значение в этом столбце не string, будет выброшено InvalidCastException.Используйте этот метод, если вы уверены, что значением является string, а string - это тип, с которым вы хотите работать.Это сделает ваш код более кратким, поскольку вам не придется выполнять приведение.

В вашем конкретном случае значение в i-м столбце текущей строки должно иметь тип string, чтоВот почему возвращаемое значение всех трех членов одинаково.

Если написано правильно, другие реализации System.Data.IDataReader должны вести себя одинаково.

...