Правильный способ распаковать значения базы данных - PullRequest
3 голосов
/ 17 декабря 2009

Я работаю с более старой базой данных 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

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

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 17 декабря 2009

Я считаю, что вспомогательные методы, такие как следующие, полезны в вашем сценарии - тестирование для 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).

Он немного отличается от вашего примера тем, что он скорее преобразует, чем конвертирует, но лично я предпочитаю это. То есть если столбец базы данных имеет значение NUMERIC (десятичное число), я бы предпочел быть явным, если бы я хотел преобразовать значение в int, например ::

int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);
0 голосов
/ 17 декабря 2009

Вы можете ввести простые классы моделей и отобразить их между собой.

Например:

public class Customer
{
   public Customer(DataRow row) 
   {
      Name = row["Name"];
   }
   public Name { get; private set; }
}

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

В зависимости от того, сколько усилий вы хотите потратить, вы можете использовать ORM mapper NHibernate.

...