Привести результат ExecuteScalar к GUID без использования строки? - PullRequest
4 голосов
/ 10 января 2011

Как можно преобразовать результат команды ExecuteScalar в структуру GUID без предварительного использования .ToString () для передачи в конструктор GUID?

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

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

Обновление: Мне также нужно обработать значения DBNull

Ответы [ 3 ]

7 голосов
/ 10 января 2011

Предполагая, что ваш SQL-оператор не может вернуть DBNull.Value, тогда да, вы можете:

Guid myResult = (Guid) cmd.ExecuteScalar();

РЕДАКТИРОВАТЬ: Теперь, когда мы знаем, что вам нужно обрабатывать нули ....: -)

Я могу придумать два способа обработки пустых значений: использовать обнуляемый Guid и установить для него значение null или использовать обычный Guid и установить для него значение Guid.Empty, если ваш оператор SQL возвращает значение NULL.

Рассмотрим некоторыеформа вспомогательной функции или метода расширения, который проверяет наличие DBNull.Value.

    static Guid? GetGuidFromDb(object dbValue)
    {
        if (dbValue == null || DBNull.Value.Equals(dbValue))
        {
            return null;
        }
        else
        {
            return (Guid) dbValue;
        }
    }

или

    static Guid GetGuidFromDb(object dbValue)
    {
        if (dbValue == null || DBNull.Value.Equals(dbValue))
        {
            return Guid.Empty;
        }
        else
        {
            return (Guid) dbValue;
        }

Затем вызовите

Guid? myResult = GetGuidFromDb(cmd.ExecuteScalar());

Примечание.Ваша команда SQL возвращает тип данных, отличный от UniqueIdentifier.

0 голосов
/ 17 февраля 2016
    Guid myResult = cmd.ExecuteScalar() as Guid? ?? Guid.Empty;
0 голосов
/ 10 января 2011

Если объект, возвращаемый из команды, является UniqueIdenitifier, тогда да.

...