質問

私は、古いOracleデータベースで働いている、と私は、データベースから取得した値をボックス化解除について移動する良い方法がありそうだと感じます。

現在、私は別のタイプ固有のメソッドの完全な静的なクラスがあります:

public static int? Int(object o)
{
    try
    {
        return (int?)Convert.ToInt32(o);
    }
    catch (Exception)
    {
        return null;
    }
}

..というように、異なるタイプのために、私はもっと良い方法があるはずと感じ?私は値をVHS版にしたい場合は、私は

...の線に沿って何かをします

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型、小数点、ダブル、ブール値、日時)のために働くます。

それは改宗するのではなくキャストでいることをあなたの例とは少し違うのです - しかし、個人的に私はこれを好みます。即ちデータベース列が(10進数)数値の場合、私は例えば、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マッパーNHibernateはを使用することができ過ごしたい努力に応じます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top