и слышал, что получение данных из SqlDataReader через порядковый номер быстрее, чем через имя столбца
Оба ваших примера получают данные через индекс (порядковый номер), а не имя столбца:
Получение данных через имя столбца:
while(reader.Read())
{
...
var value = reader["MyColumnName"];
...
}
потенциально медленнее, чем получение данных через индекс:
int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
...
var value = reader[myColumnIndex];
...
}
потому что первый пример должен повторно найти индекс, соответствующий «MyColumnName». Если у вас очень большое количество строк, разница может быть даже заметной.
В большинстве случаев разница не будет заметна, поэтому предпочтение читаемости.
UPDATE
Если вы действительно обеспокоены производительностью, альтернативой использованию ординалов является использование класса DbEnumerator следующим образом:
foreach(IDataRecord record in new DbEnumerator(reader))
{
...
var value = record["MyColumnName"];
...
}
Класс DbEnumerator
читает схему один раз и поддерживает внутреннюю таблицу HashTable, которая отображает имена столбцов по порядковым номерам, что может повысить производительность.