2011-11-10 14 views
2

SqlDataReaderを使用しているときに私のコードにこのような種類のロジックがたくさんあります これを処理するよりクリーンな方法がありますか?DBNullを処理する一般的な方法

if (reader["VisitingAddressId"] != DBNull.Value) 
{ 
    visitingAddress = new Address() 
    { 
     AddressId = Convert.ToInt64(reader["VisitingAddressId"]), 
     Address1 = reader["VisitingAddress"].ToString(), 
     AddressType = AddressType.VisitingAddress, 
     PostalCode = reader["VisitingPostal"].ToString(), 
     PostalDistrict = reader["VisitingPostalDistrict"].ToString() 
     }; 
    } 

if (reader["PostalAddressId"] != DBNull.Value) 
{ 
    postalAddress = new Address() 
    { 
     AddressId = Convert.ToInt64(reader["PostalAddressId"]), 
     Address1 = reader["PostalAddress"].ToString(), 
     AddressType = AddressType.PostalAddress, 
     PostalCode = reader["PostalPostal"].ToString(), 
     PostalDistrict = reader["PostalPostalDistrict"].ToString() 
     }; 
    } 

答えて

2

あなたはDapperのようなマイクロORMを使用することができます。http://code.google.com/p/dapper-dot-net/

マルチマッピング機能は、すべてのことボイラープレートコードを排除するであろう。

db.Query<Post,Address,Address,Post>("select * from Posts left join Address ... etc", 
(post,vaddress,paddress) => 
    { 
    post.VisitingAddress = vaddress; 
    post.PostalAddress = paddress; 
    return post; 
    }); 
+0

をこれはちょうど明らかです –

+0

@KierenJohnstone - 私はDapperをORMとして本当に分類しません。それははるかに簡単であり、セマンティクスを変更することなく、OPサンプルの定型コードを完全に排除することができます。 –

+0

まあ、 ".NET用の単純なオブジェクトマッパー"はOとMを処理します。 "DapperはIDbConnectionインターフェイスを拡張するプロジェクトにドロップできる単一のファイルです。" R(つまりRDBMS)を処理します:) –

0

あなたが言及しているのは、多くのORMです。 NHibernate、Entity Framework、さらにはADO.NET(既に使用している)でもリレーショナルデータセットがサポートされていますが、通常はDataSetまたは派生した厳密な型指定クラスを使用する必要があります。

リストはこちら.NETのセクションをご覧ください:

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

をあなたが要件を教えてください。多分それを絞り込むことができます。

+0

すでにEntityFrameworkを使用していますが、この特定のケースでは、従来のADO.NETを使用してストアドプロシージャを呼び出します。エンティティ・フレームワークとストアド・プロシージャを使用して関連オブジェクトをロードするにはいくつかの問題がありました。 – RobinHu

3

私は(あなたが静的両方のそれらを作ることができる)データ・サービス・クラスでこれらのヘルパーメソッドを持っている:

public T CastDBValue<T>(object value) 
    { 
     return MapValue<T>(value); 
    } 

    internal static T MapValue<T>(object value) 
    { 
     try 
     { 
      T result; 
      result = value == DBNull.Value ? default(T) : (T)value; 
      return result; 
     } 
     catch (InvalidCastException cex) 
     { 
      logger.ErrorFormat("Invalid cast while mapping db value '{0}' to type {1}. Error: {2}", value, typeof(T).Name, cex); 
      throw new InvalidCastException(string.Format("Invalid cast while mapping db value '{0}' to type {1}. Error: {2}", value, typeof(T).Name, cex.Message)); 
     } 
    } 

次に、あなたのマッピングコードで、あなただけの操作を行います。

AddressId = dataService.CastDBValue<int>(reader["AddressId"])); 
if (AddressId > 0) { ... } 
+0

これは私が探していたものです。ありがとうございました! – RobinHu

関連する問題