Зачем использовать метод GetOrdinal() для SqlDataReader

В чем разница между чтением значения из SqlDataReader с использованием этого синтаксиса:

Dim reader As SqlClient.SqlDataReader
reader("value").ToString()

ИЛИ

Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))

Ответ 1

Я думаю, что причина использования GetOrdinal() заключается в том, что вы можете кэшировать результат и повторно использовать его несколько раз для повышения производительности.

например.

Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while ( ... )
{
    var value = reader.GetString(valueOrdinal);
}

Ответ 2

GetOrdinal сначала выполняет поиск с учетом регистра. Если это не удается, выполняется второй поиск без учета регистра. GetOrdinal является нечувствительным к каналу. Поскольку ординарные поисковые запросы более эффективны, чем именованные, неэффективно вызывать GetOrdinal в цикле. Сэкономьте время, вызвав GetOrdinal один раз и присвоив результаты целочисленной переменной для использования в цикле.

Источник: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

Ответ 3

Я просто хочу добавить, что контекст того, сколько записей, которые вы ожидаете, играет большую роль, потому что, если вы возвращаете одну строку, разница в производительности между этими двумя не будет значительной. Однако, если вы зацикливаете на многие строки, то использование типизированного доступа лучше для производительности, так как оно оптимизировано. Таким образом, в этом случае, если вам нужно получить лучшую производительность с помощью имени столбца, тогда вызовите GetOrdinal один раз, поместите его в переменную, а затем используйте типизированный accessor с порядковым номером столбца в вашем цикле. Это обеспечит наилучшую производительность.

если вам интересно узнать о различиях в производительности, мой пост в блоге