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

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

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

ИЛИ ЖЕ

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

4 ответа

Решение

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

Например

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

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

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

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

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

Ваш пробег может отличаться, но...

Чем больше строк вы выбираете, тем больше улучшения производительности вы увидите. Мне нравится использовать псевдонимы столбцов в моих инструкциях SELECT, например,

select
    physical_column_name as "MyFieldName"

и написали метод, должен быть самоочевидным,

public Dictionary<String, Int32> GetOrdinalsByName(DbDataReader reader)

Итак, мои задания выглядят так

    public void BindRow(DbDataReader dr)
    {
        TerminationDate = dr.GetDateTime(_columnOrdinals["TerminationDate"]);

Словари выполняют близко к O(1); Итак, это разумный компромисс между производительностью и ремонтопригодностью.

Другие вопросы по тегам