2014-06-23 4 views
1

quickbooks 데이터베이스 내에있는 항목의 목록을 가져 오려고합니다. 쿼터백 데이터베이스의 특정 서비스 항목이 설명이되지 않기 때문에QBFC를 사용하여 quickbooks의 null 값 확인

item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue(); 
"Object reference not set to an instance of an object" 

:

    IItemServiceRet itemServiceRet = itemRet.ItemServiceRet; 

        TestItem item = new TestItem(); 
        item.Name = itemServiceRet.Name.GetValue(); 
        item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue(); 
        item.Rate = itemServiceRet.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue().ToString(); 
        item.ItemType = "Service"; 
        item.QBID = itemServiceRet.ListID.GetValue(); 
        item.EditSeq = itemServiceRet.EditSequence.GetValue(); 

코드는 라인에 실패 : 나는 다음 코드 조각이있다. 각 라인에 if 문을 포함시킬 필요없이 null 값을 확인하는 '깨끗한'방법이 있다면 호기심이 생겼습니다. GetValue()이 null을 반환하는지 확인 하시겠습니까?

편집 : 앤드류 쿠퍼의 솔루션 시도 후 :

item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue(); 

을 여전히 예외가 발생합니다 :

Object reference not set to an instance of an object 

그것의 GetValue()가 전혀 설명이 없으면 아무 것도 반환하지 않는 경우로한다 별로 의미가 없을 것입니다.

item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue(); 

을하지만 꽤 추한 :

+0

item.Desc가 값을 찾고 있습니다. 따라서 null 대신 빈 문자열을 넣어야합니다. 또한 Ternary 연산자가 아닌 간단한 If Then을 사용해야 할 수도 있습니다. – user890332

답변

2

는이 같은 삼항 연산자를 사용할 수 있습니다.

가장 좋은 방법은 임의의 유형 Desc을 가져 와서 위의 논리를 래핑하는 도우미 메서드를 만드는 것입니다.

+0

나는 그것을 시도하고 여전히 "객체 참조가 객체의 인스턴스로 설정되지 않음"을 얻는다. 마치 GetValue()가 아무것도없는 경우 null을 반환하지 않지만 아무 것도 반환하지 않는 것처럼 말이다. – user1806716

+1

null 인 'Desc'속성입니다. null 참조에서'.GetValue()'를 호출하면 예외가 발생합니다. 'Desc'가 널이 아닌 값을 가지고 있다면'.GetValue()'는 잘 작동 할 것입니다. –

1

null 객체의 기능에 액세스 할 수 없으므로 더 나은 해결책이 없다고 생각합니다. 나는 일반적으로 체크를 수행하는 항목에 대한 생성자를 생성하므로 한 번만 수행하면됩니다. 귀하의 예제에서 그래서 :

TestItem item = new TestItem(itemRet.ItemServiceRet);

생성자는 다음과 같이 보일 것이다 :

public TestItem(IItemServiceRet i) 
{ 
    if(i.Name != null) this.Name = i.Name.GetValue(); 
    if(i.ORSalesPurchase != null) 
     if(i.ORSalesPurchase.SalesOrPurchase != null) 
     { 
      if(i.ORSalesPurchase.SalesOrPurchase.Desc != null) this.Desc = i.ORSalesPurchase.SalesOrPurchase.Desc.GetValue(); 
      if(i.ORSalesPurchase.SalesOrPurchase.ORPrice != null) 
       if(i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price != null) this.Price = i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue(); 
     } 
}
이 빈 문자열은 일반적으로 빈 필드와 동일로이 문자열을 위해 잘 작동 않음을 명심하지만에서 숫자 필드 QuickBooks이 문제가 발생할 수 있습니다. 예를 들어, 송장 행에는 수량 필드 (두 배)가있을 수 있습니다. double 값의 기본값은 0.0이지만 QuickBooks의 빈 수량 필드는 1.0의 수량으로 처리됩니다. 또한 QuickBooks 날짜 필드가 null 일 수 있으므로 날짜 문제가 발생할 수 있습니다.