Это не ответ, но дано:
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;
^
Можно использовать более короткую форму:
return (accountNumber == DBNull.Value) ? string.Empty : accountNumber.ToString()
РЕДАКТИРОВАТЬ: Не обращал внимания на ExecuteScalar. Он действительно возвращает null, если поле отсутствует в возвращаемом результате. Поэтому используйте вместо этого:
return (accountNumber == null) ? string.Empty : accountNumber.ToString()
ExecuteScalar вернет
Если вы знаете, что первый столбец набора результатов представляет собой строку, затем, чтобы охватить все базы, вам необходимо проверить как 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.
С простая универсальная функция, вы можете сделать это очень легко. Просто сделайте это:
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;
}
}
Вы можете использовать нулевой оператор объединения C #
return accountNumber ?? string.Empty;
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 :)
Есть еще один способ обойти эту проблему. Как насчет изменения процедуры хранения? используя функцию ISNULL (ваше поле, "") sql, вы можете вернуть пустую строку, если возвращаемое значение равно нулю.
Тогда у вас есть чистый код в виде оригинальной версии.