Повышение производительности C #, возвращая Nullable Type из SqlDataReader - PullRequest
7 голосов
/ 15 июля 2010

У меня есть простой метод, который возвращает Nullable Int32 из DataReader, а не встроенный GetInt32.

Я вызываю этот метод много раз и имею одну ситуацию, когда в любое время я могу его сбритьбыло бы полезно.

Кто-нибудь может предложить какие-либо альтернативные и более быстрые способы получения обнуляемого Int32 из DataReader?

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    return !dataReader.IsDBNull(fieldIndex) ? 
                dataReader.GetInt32(fieldIndex) : (Int32?)null;
}

Ответы [ 2 ]

9 голосов
/ 15 июля 2010

I кажется напоминает, что иногда можно быстрее получить значение как объект и затем проверить, является ли это DBNull.

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    object value = dataReader.GetValue(fieldIndex);
    return value is DBNull ? (Int32?) null : (Int32) value;
}

По крайней мере, стоит попробовать.Обратите внимание, что это предполагает, что вы можете распаковать прямо на int ... Я не знаю наверняка, правильно ли это, но это будет легко увидеть.

Теперь есть другой подход, который несколькоменее безопасный - он вернет ноль для любого нецелого значения, даже если поле на самом деле является строкой, например:

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    return dataReader.GetValue(fieldIndex) as Int32?;
}

Я ранее писал об «как», а типы, допускающие обнуление, не являютсябыстрый, как я ожидал, но это может быть немного другой случай ... опять же, стоит попробовать.

Однако я был бы очень удивлен, если это действительно узкое место ... конечнов первую очередь получение данных из базы данных будет намного дороже.У вас есть для этого критерии?

2 голосов
/ 15 июля 2010

Код, который вы хотите оптимизировать (?:), будет незначительным по сравнению с окружающим вводом / выводом.

Так что, он не станет быстрее.

...