Краткое использование DBNull? (Троичный?)

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

Я хотел бы смочь использовать

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;

но вместо этого я застреваю с этим:

if (string.IsNullOrEmpty(dest.Id))
{
    proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
    proc.Parameters[PARAM_ID].Value = dest.Id;
} 

Тернарный оператор перестал работать, потому что нет никакого преобразования, возможного между DBNull и строкой, и столь же глупо, как это кажется, что Значение рассмотрения является объектом, компилятор отвечает ему ударом на удар мне, и я вынужден заботиться. Ответ на nullable версию этого вопроса должен просто бросить пустой указатель, чтобы представить в виде строки и быть сделанным с ним; DBNull не может быть брошен для строкового представления, тем не менее, так никакая удача там.

Есть ли более краткий способ сделать это (не используя nullables, между прочим?)

Спасибо!

9
задан Jacob 9 August 2010 в 22:58
поделиться

3 ответа

Вы можете изменить свой первый оператор на:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
21
ответ дан 4 December 2019 в 06:35
поделиться

Или вы можете добавить метод расширения, такой как:

public static class DBNullExtensions
{
    public static object AsDBNullIfEmpty(this string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            return DBNull.Value;
        }
        return value;
    }
}

И тогда вы можете просто сказать

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();

(Адаптировано из Phil Haack)

Читабельно и лаконично, нет?

6
ответ дан 4 December 2019 в 06:35
поделиться

Свойство Value имеет тип объект , поэтому вам следует привести его к объекту , а не к строке ]:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;
6
ответ дан 4 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: