Правильный способ распаковать значения базы данных
Вопрос
Я работаю со старой базой данных Oracle, и я чувствую, что, вероятно, есть лучший способ распаковать значения, которые я извлекаю из базы данных.
В настоящее время у меня есть статический класс, полный различных методов, зависящих от конкретного типа:
public static int? Int(object o)
{
try
{
return (int?)Convert.ToInt32(o);
}
catch (Exception)
{
return null;
}
}
.. и так далее для разных типов, но я чувствую, что должен быть лучший способ?Если я хочу распаковать значение, я делаю что-то вроде...
int i;
i = nvl.Int(dataRow["column"]); //In this instance, "column" is of a numeric database type
Я думал об использовании универсального класса для обработки всех различных типов, но я действительно не мог придумать наилучшего способа добиться этого.
Есть какие-нибудь идеи?
Решение
Я нахожу вспомогательные методы, такие как следующие, полезными в вашем сценарии - тестирование DBNull более эффективно, чем перехват исключения, как в вашем примере:
public static MyHelper
{
public static Nullable<T> ToNullable<T>(object value) where T : struct
{
if (value == null) return null;
if (Convert.IsDBNull(value)) return null;
return (T) value;
}
public static string ToString(object value)
{
if (value == null) return null;
if (Convert.IsDBNull(value)) return null;
return (string)value;
}
}
Это работает для строки и обычных примитивных типов значений, с которыми вы столкнетесь (int, decimal, double, bool, DateTime).
Он немного отличается от вашего примера тем, что он отбрасывает, а не преобразует - но лично я предпочитаю это.То есть.если столбец базы данных является ЧИСЛОВЫМ (десятичным), я бы предпочел быть явным, если бы хотел преобразовать значение в int, например:
int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);
Другие советы
Вы могли бы ввести простые классы моделей и сопоставить их.
Например:
public class Customer
{
public Customer(DataRow row)
{
Name = row["Name"];
}
public Name { get; private set; }
}
Конечно, чтобы уменьшить дублирование кода, вы могли бы создать базовый класс для ваших классов данных модели.
В зависимости от усилий, которые вы хотите потратить, вы могли бы пойти и использовать ORM mapper NHibernate.