В конечном итоге это зависит от конкретной реализации 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
должны вести себя одинаково.