3

古い 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

ジェネリック クラスを使用してすべての異なる型を処理することを考えましたが、それを実行する最善の方法を実際に理解できませんでした。

何か案は?

4

2 に答える 2

6

次のようなヘルパーメソッドがシナリオで役立つと思います。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(10進数)の場合、値をintに変換する場合は、明示的にします。例:

int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);
于 2009-12-17T18:12:47.057 に答える
0

単純なモデルクラスを導入し、それらの間にマップすることができます。

例えば:

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

もちろん、重複するコードを減らすために、モデルデータクラスの基本クラスを作成することもできます。

費やしたい努力に応じて、ORMマッパーNHibernateを使用することができます。

于 2009-12-17T18:15:29.690 に答える