2009-08-13 4 views
3

다른 방법으로 반환 된 IDataReader에서 컬렉션을 채우려고합니다 ... "이 개체에 대해 정의 된 매개 변수없는 생성자가 없습니다."던지는 이유가 있습니다. 이 라인에 대한 오류 : 나는이 때까지 일을 별도로 초기화 얻을 수 있도록 매개 변수를 분리 해 해봤CBO.FillCollection throwing "이 개체에 대해 정의 된 매개 변수없는 생성자가 없습니다." 오류

List<string> names = CBO.FillCollection<string>(DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1))); 

:

List<string> names = CBO.FillCollection<string>(nameDataReader); 

을하고 난 여전히 같은 줄에 오류를 얻고 있었다.

아이디어가 있으십니까?

답변

5

단서는 메시지에 있습니다. System.String에 대한 매개 변수없는 생성자가 없으므로 일반적으로 객체를 동적으로 만드는 데 사용되는 Activator.CreateInstance을 사용하여 만들 수 없습니다.

편집 : 해결책 직접 리더를 사용하는 것은 :

var strings = new List<string>(); 
using(var reader = DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1))) 
{ 
    while(reader.Read()) 
     strings.Add(reader[0] as string); 
} 
+0

그래서 무엇을해야합니까? – Matt

+0

가능한 해결책을 추가했습니다 - hth –

+0

굉장합니다, 감사합니다! – Matt

1

CBO.FillCollection은 값 형식에 문제가있는 것.

더 나은 대답은 이미 당신이 당신의 문제를 해결 한 수 (직접 독자 액세스),하지만 FillCollection 방법을 찾고 이해하는 게시 :

로 설정 속성에 새로운 클래스를 추가 당신의 SQL 열 이름 :

class StringRow { public string Name; } 

같이, FillCollection에 전달하는 데 사용 :

List<string> stringCollection = new List<string>(); 
foreach (StringRow row in CBO.FillCollection<StringRow>(DataProvider...)) 
{ 
    stringCollection.Add(row.Name); 
} 

그것은 refle 수있는 명명 된 속성을 가진 객체를 원한다 적극적으로 설정합니다. 따라서 int의 목록을 검색하는 경우에도 int 객체에는 'Name'속성 (SQL 반환 세트의 열에서 가져온 속성)이 없으므로 설정하면 0의 목록이 반환됩니다.

불행히도 int?을 사용하고 SQL 반환 열을 [값]으로 설정해도 해결책을 해결하지 못합니다.

관련 문제