Не мог бросить объект типа 'Система. DBNull' для ввода 'Системы. Строка'

Это не ответ, но дано:

std::cout << "16 structs: " << sizeof(byte_struct[16]) << std::endl;
std::cout << "16 enums:   " << sizeof(byte_enum  [16]) << std::endl;

clang печатает:

16 structs: 256
16 enums:   16

и gcc выдает ошибку:

error: alignment of array elements is greater than element size
  std::cout << "16 enums:   " << sizeof(byte_enum  [16]) << std::endl;
                                                      ^
99
задан mgilson 29 May 2013 в 13:39
поделиться

6 ответов

Можно использовать более короткую форму:

return (accountNumber == DBNull.Value) ? string.Empty : accountNumber.ToString()

РЕДАКТИРОВАТЬ: Не обращал внимания на ExecuteScalar. Он действительно возвращает null, если поле отсутствует в возвращаемом результате. Поэтому используйте вместо этого:

return (accountNumber == null) ? string.Empty : accountNumber.ToString() 
82
ответ дан 24 November 2019 в 04:58
поделиться

ExecuteScalar вернет

  • null, если нет набора результатов
  • , в противном случае первый столбец первой строки набора результатов, который может быть DBNull.

Если вы знаете, что первый столбец набора результатов представляет собой строку, затем, чтобы охватить все базы, вам необходимо проверить как null, так и DBNull. Примерно так:

object accountNumber = ...ExecuteScalar(...);
return (accountNumber == null) ? String.Empty : accountNumber.ToString();

Приведенный выше код основан на том, что DBNull.ToString возвращает пустую строку.

Если accountNumber был другого типа (скажем, целое число), вам нужно было бы быть более явным:

object accountNumber = ...ExecuteScalar(...);
return (accountNumber == null || Convert.IsDBNull(accountNumber) ?     
         (int) accountNumber : 0;

Если вы точно знаете, что в вашем наборе результатов всегда будет хотя бы одна строка (например, SELECT COUNT (*) .. .), то вы можете пропустить проверку на null.

В вашем случае сообщение об ошибке «Невозможно преобразовать объект типа 'System.DBNull' в тип 'System.String`» указывает на то, что первый столбец вашего набора результатов - значение DBNUll.

15
ответ дан 24 November 2019 в 04:58
поделиться

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

return ConvertFromDBVal<string>(accountNumber);

используя функцию:

public static T ConvertFromDBVal<T>(object obj)
{
    if (obj == null || obj == DBNull.Value)
    {
        return default(T); // returns the default value for the type
    }
    else
    {
        return (T)obj;
    }
}
186
ответ дан 24 November 2019 в 04:58
поделиться

Вы можете использовать нулевой оператор объединения C #

return accountNumber ?? string.Empty;
6
ответ дан 24 November 2019 в 04:58
поделиться

I suppose you can do it like this:

string accountNumber = DBSqlHelperFactory.ExecuteScalar(...) as string;

If accountNumber is null it means it was DBNull not string :)

2
ответ дан 24 November 2019 в 04:58
поделиться

Есть еще один способ обойти эту проблему. Как насчет изменения процедуры хранения? используя функцию ISNULL (ваше поле, "") sql, вы можете вернуть пустую строку, если возвращаемое значение равно нулю.

Тогда у вас есть чистый код в виде оригинальной версии.

3
ответ дан 24 November 2019 в 04:58
поделиться
Другие вопросы по тегам:

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