2017-10-12 8 views
2
내가 SqlDataReader 개체 개체에서 런타임에 특정 속성 값을 설정하려는
List<T> returnList = new List<T>(); 
conn.Open(); 
SqlCommand sCmd = new SqlCommand(query, conn); 
SqlDataReader dataReader = sCmd.ExecuteReader(); 
T t = new T(); 
PropertyInfo[] p = o.GetType().GetProperties(); 
while(dataReader.Read()) 
{ 
    for (int i = 0; i < p.Length; i++) 
    { 
     Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" 
     "+dataReader[i].GetType()); 
     p[i].SetValue(dataReader[i], t); 
    } 
    returnList.Add(t); 
} 
return returnList; 

에서 유형을 대상으로 속성 값을 설정할 수 없습니다. 두 참조가 모두 같은 형식인데 대상 유형 불일치가 예외적입니다.는 SqlDataReader 개체 유형

+0

이 예외는 어떤 경우에 발생합니까? 데이터 배열의 열이 귀하의 속성과 동일한 순서로 있다는 것을 어떻게 알 수 있습니까? –

+1

값을 설정하는 선과 표에 내 열을 배치하는 순서를 클래스에 작성했습니다 –

+0

메소드 서명에 코드를 추가 할 수 있습니까? (공용/개인 목록 myMethodName ...) –

답변

1

두 가지 문제가 있습니다. 주된 것은 SetValue()으로 잘못 호출 한 것입니다. MSDN에서

:

공공 무효 SetValue는 (객체 OBJ, 개체 값)

그래서 실제로 잘못된와 메서드를 호출하는 인수를 배치했다. 이 작업을 수행하고 그것을 잘해야한다 : 당신이 발생합니다

p[i].SetValue(t, dataReader[i]); 

두 번째 문제는 한 번만 (T t = new T(); 새로운 객체를 생성하기 때문에 마지막에 목록이 만 같은 객체를 포함 할 것입니다 그것을 해결하기 위해. 당신이 당신의 연결을 마지막에 당신의 명령을 처리 ... 그리고 닫아야하기 때문에, 당신은. 당신의 while 루프 내부 청소기 코드 또한

, use using을이 선을 배치해야합니다.

모두 모두를, 이것은이다 최종 코드 :

List<T> returnList = new List<T>(); 
conn.Open(); 
using (SqlCommand sCmd = new SqlCommand(query, conn)) 
{ 
    SqlDataReader dataReader = sCmd.ExecuteReader(); 
    PropertyInfo[] p = o.GetType().GetProperties(); 
    while(dataReader.Read()) 
    { 
     T t = new T(); 
     for (int i = 0; i < p.Length; i++) 
     { 
      Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" "+dataReader[i].GetType()); 
      p[i].SetValue(t, dataReader[i]); 
     } 
     returnList.Add(t); 
    } 
} 
conn.Close(); 
return returnList; 
+1

감사합니다. –

+2

@SohelAhmed이 질문에 대한 답변이 있으면 답변으로 표시하십시오 (답변 상단에있는 확인 표시). 그런 식으로 다른 사람들은이 질문에 답을 얻게됩니다. –