2012-10-26 1 views
0

DataRow 값을 사전 (columnName, expectedColumnValue)으로 제공된 예상 값과 비교하는 데이터베이스 테스트 유틸리티 코드를 작성했습니다.DataRow의 값과 Dictionary 개체의 비교

많은 형식에서는 잘 작동하지만 바이트와 짧은 경우 값을 Int32로 변환하는 변환 코드를 추가해야했습니다.

두 질문 :

  1. 는 어떻게이 코드가 더 나은, 즉 어떻게 변환을 방지 할 수 있도록하는 아이디어가 있습니까? 10 진수와 부동 소수점의 경우 10 진수/부동 소수점 값으로 명시 적으로 선언되었으므로 작동하는 것으로 보입니다. Long은 문제없이 작동합니다.

  2. 다른 방법이 없다면 걱정할 필요가있는 짧은 문자와 바이트 이외의 다른 유형이 있습니까? 아래

데모 코드 : 비교할 때

  var table = new DataTable(); 
      table.Columns.Add(new DataColumn("CarrierId", typeof(byte))); 
      table.Columns.Add(new DataColumn("NotationId", typeof(short))); 

      var row = table.NewRow(); 
      row[0] = 5; 
      row[1] = 123; 

      table.Rows.Add(row); 

      var expected = new Dictionary<string, object> 
      { 
       {"CarrierId", 5}, 
       {"NotationId", 123}, 
      }; 

      foreach (var entry in expected) 
      { 
       var value = row[entry.Key]; 
       var expectedValue = entry.Value; 

       if (value is short || value is byte) 
        value = Convert.ToInt32(value); 

       Console.WriteLine(); 
       Console.WriteLine(String.Format("Not converted: {0}", row[entry.Key].Equals(entry.Value))); 
       Console.WriteLine(String.Format("Converted (if applicable): {0}", value.Equals(expectedValue))); 

      } 
+0

강하게 입력 된 ['Row.Field '] (http://msdn.microsoft.com/en-us/library/bb360891.aspx) 확장 방법을 사용하십시오. –

+0

전염병과 같은 데이터 세트/데이터 테이블/데이터row를 피하십시오. 사용자 정의 클래스와 ORM을 사용하십시오. :) – dumdum

+0

@TimSchmelter : 최대한 단순하게 유지하기 위해 유형을 전달하지 않으려합니다. 그렇지 않으면 테스트가 필요한 모든 테이블의 코드를 변경해야합니다. –

답변

3

가 사전에 자신의 예상 유형의 값을 추가, 당신은 더 이상 변환을 수행 할 필요가 없습니다 :

var expected = new Dictionary<string, object> 
{ 
    { "CarrierId", (byte)5 }, 
    { "NotationId", (short)123 }, 
}; 

에 상수 식 (컴파일 타임에 알려진)으로 주어진 숫자 int을 할당 할 때변수는 C#에서 자동으로 byte으로 변환됩니다.

byte b = 5; // Stores a byte 

그러나 당신이 object 변수에 할당 할 때, C#을 당신이 미래 기본적으로 int 등의 위협을의 byte로 사용된다는 것을 알 수 없습니다.

object o = 5; // Stores an int 
+0

이벤트가이 경우 바이트 b = 5; 그것은 int에서 byte 로의 암시 적 변환을 수행합니다. http://msdn.microsoft.com/en-us/library/5bdb6693(v=vs.71).aspx –

+0

그게 전부입니다. 답변을 주셔서 감사합니다. –

+0

@ 닉 : 네,하지만 이것은 아마도 litteral에만 적용됩니다. 생성 된 일리노이 코드에는 변환이 없을 것입니다. –

0

올리비에 Jacot-Descombes의 대답 이외에, 당신은이 코드를 시도 할 수 있습니다 :

object o = 5; 
var v = o; 
if (v is short) 
    MessageBox.Show("short"); 
else if (v is byte) 
    MessageBox.Show("byte"); 
else if (v is int) 
    MessageBox.Show("int"); 

당신이 그것을 int로하기 때문에, varint 될 것 본질적 인 objectinteger 문자를 할당 할 때마다. 따라서 데이터베이스의 형식에 캐스트를 사용하는 것이 좋을 것입니다.

+0

그러나 올리비에가 제안한 것처럼 객체에 할당 할 때 짧게 5를 던지면 첫 번째 if는 true로 평가됩니다. object p = (short) 5; var x = p; –

+0

@Joanna 물론, 그것은 그렇게 생각합니다. Var 변수는 오른손 유형의 실제 유형에 따라 결정됩니다. –

+0

예,'var'의 실제 유형은 등호 오른쪽의 표현식의 정적 유형에서 평가됩니다. 'o'에있는 값의 타입은 차이가 없습니다. 'v'는 항상'객체'가 될 것입니다. 그러나 'v'에 저장된 값은 'int'가됩니다. –