Правильный способ распаковать значения базы данных

StackOverflow https://stackoverflow.com/questions/1923498

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top