2009-08-24 5 views
4

을 확인 (행 [somecolumn])이 코드를 작성하는 더 좋은 방법이 있나요 .. 가이 작업을 수행 할 수있는 더 좋은 방법입니다 Convert.IsDBNull

MyObject pymt = new MyObject(); 
pymt.xcol1id= Convert.IsDBNull(row["col1id"]) ? 0 : (int)row["col1id"]; 
pymt.xcold2id= Convert.IsDBNull(row["col2id"]) ? String.Empty : (string)row["col2id"]; 
pymt.xcold3id = Convert.IsDBNull(row["CustNum"]) ? 0 : (decimal)row["xcold3id"]; 

이 깨끗한 방법으로 할 수 있습니다 .. 일반적인 방법 등?

+0

가능한 중복 http://stackoverflow.com을/questions/221582/most-efficient-way-to-a-variable에 dbnull-and-assign-to-a-variable에 할당) – nawfal

답변

1
static ToType GenericConvert<ToType>(object value) 
     { 
      ToType convValue = default(ToType); 

      if (!Convert.IsDBNull(value)) 
       convValue = (ToType)value; 

      return convValue; 
     } 


MyObject pymt = new MyObject(); 
pymt.xcol1id= GenericConvert<int>(row["col1id"]); 
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty; 
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]); 
+0

기본 (문자열)은 String.Empty가 아니라 null ... – Guffa

+0

@ Guffa, 코드를 수정, 그것에 대해 잊어 버렸습니다. –

0

저는 실제로 그렇게합니다. 우리 팀은 제 의견으로는 읽기가 어려운 if/else 문을 사용하고있었습니다.

if (row["col1id"] == dbnull.value) 
    pymt.xcol1id = 0; 
else 
    pymt.xcol1id = (int)row["col1id"]; 

각 줄을 개별 줄에 배치하므로 코드를 읽기가 쉽습니다.

Stan에서 제안한 기능은 줄을 짧게 만들 수 있지만 매우 자세한 이름을 지정하지 않으면 널 (null)이 대체된다는 사실을 숨 깁니다.

8

이 같은 일반적인 확장 메서드를 만들 수 :

public static class DataRowExtensions { 

    public static T GetValueOrDefault<T>(this DataRow row, string key) { 
     return row.GetValueOrDefault(key, default(T)); 
    } 

    public static T GetValueOrDefault<T>(this DataRow row, string key, T defaultValue) { 
     if (row.IsNull(key)) { 
     return defaultValue; 
     } else { 
     return (T)row[key]; 
     } 
    } 

} 

사용법 :

MyObject pymt = new MyObject(); 
pymt.xcol1id = row.GetValueOrDefault<int>("col1id"); 
pymt.xcold2id = row.GetValueOrDefault<string>("col2id", String.Empty); 
pymt.xcold3id = row.GetValueOrDefault<int>("CustNum"]); 
+0

doh! 나를 펀치에 이겼다. – Brannon

+0

+1 구현이 내 것보다 낫다. 나는 언급 한 내용을 수정하기 위해 내 문제를 해결한다. 하지만 지금은 더러워 보입니다 : ( –

+0

VS2005, .net 2.0 버전을 사용하기 때문에이 접근법을 사용하기로 결정했습니다. 귀하의 의견을 모두 주셔서 감사 드리며, 대단히 감사합니다 ... –

5

을 나는 것과 같은 상황에서 널 병합 연산자를 사용하는 경향이있다. 또한 DBNull.ToString은 string.Empty를 반환하므로 아무 것도 그럴 필요가 없습니다. 내가 빨리 생각할 수

MyObject pymt = new MyObject(); 
pymt.xcol1id= row["col1id"] as int? ?? 0; 
pymt.xcold2id= row["col2id"].ToString(); 
pymt.xcold3id = row["CustNum"] as decimal? ?? 0; 
+1

+1 처음에이 글을 쓸 것입니다. ,하지만 GenericConvert를 작성하기로 결정했습니다. –

+0

설정중인 속성이 int가 아니고 int가 아닌 경우에는 작동하지 않습니다. 그럴거야? –

+0

컴파일러는 널 (null)이 설정되지 않는다는 것을 알기 때문에 그럴 것이다. –

0

일부 대안 :

  1. 강력하게 형식화 된 데이터 집합을
  2. 는 사용 ReadSqlInt32 같은 SQLTYPE으로 독자들은 모두 INullable을 구현하기 때문이다.
  3. XML에서 XSLT 변환 코드를 생성하므로 확인 코드를 쉽게 변경하고 유지 관리 할 수 ​​있습니다. 더 나은
2

아직 DataRow에 확장 메서드로 추가 :

static T GetValueOrDefault<T>(this DataRow row, string columnName) 
{ 
    if (!row.IsNull(columnName)) 
    { 
     // Might want to support type conversion using Convert.ChangeType(). 
     return (T)row[columnName] 
    } 

    return default(T); 
} 

당신이 좋아하는 그것을 사용할 수 있습니다

pymt.xcol1id = row.GetValueOrDefault<int>("col1id"); 
pymt.xcol2id = row.GetValueOrDefault<string>("col2id"); 
pymt.xcol3id = row.GetValueOrDefault<decimal>("col3id"); 
+0

기본 (문자열)은 String.Empty가 아니지만 null입니다 ... – Guffa

+0

좋은 지적입니다. 답을 더 자세히 작성하는 것보다 답을 더 자세히 작성하는 것이 더 완벽합니다. – Brannon

5

을 물론 경우에 그 코드를 작성하는 청소기 방법이 당신 .NET 3.5를 사용하고 Microsoft가 이미 작성한 확장 방법을 다시 발명하지 않아도됩니다. 그냥 System.Data.DataSetExtensions.dll에 대한 참조를 추가하고 당신이 할 수 있습니다 :

MyObject pymt = new MyObject 
       { 
        xcol1id = row.Field<int?>("col1id") ?? 0, 
        xcol2id = row.Field<string>("col2id") ?? String.Empty, 
        xcol3id = row.Field<decimal?>("col3id") ?? 0M 
       }; 
[? 변수에 할당 한 후 DBNull이 확인하고 가장 효율적인 방법] (의
관련 문제