2011-11-10 6 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

당신은 말끔 같은 마이크로 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

관련 문제