2010-03-29 4 views
1

그래서 C# winForms의 목록 배열에 값을 저장하려고합니다. for 루프에서 sql statment를 만들면 모든 것이 잘 작동합니다. 메시지 상자는 매번 다른 약물 이름을 출력합니다.이상한 결과 C# winForms 배열 목록 배열

for (int i = 0; i < numberOfMeds; i++) 
{ 

queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id; 

using (var conn = new SqlConnection(connStr)) 
using (var cmd = new SqlCommand(queryStr, conn)) 
{ 
    conn.Open(); 

    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
    while (rdr.Read()) 
    { 
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"]; 
    medObject.medication_name = rdr["medication_name"].ToString(); 
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]); 

    medsList[i].Add(medObject); 

    } 
    } 
    conn.Close(); 

    MedicationTimelineClass medObjectx = medsList[i][0] as MedicationTimelineClass; 
    MessageBox.Show(medObjectx.medication_name); 
} 
} 

나는이 목록의 배열이 채워되어있을 가능성을 의미 루프에서 메시지 상자 코드를 찍을 때하지만, 난 항상 같은 값을 얻을 : 마지막으로 입력 한 값입니다. 그 약의 이름은 상관 없어요. List의 전체 배열에 동일한 데이터가 채워지는 것과 같습니다.

for (int i = 0; i < numberOfMeds; i++) 
{ 

queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id; 

using (var conn = new SqlConnection(connStr)) 
using (var cmd = new SqlCommand(queryStr, conn)) 
{ 
    conn.Open(); 

    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
    while (rdr.Read()) 
    { 
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"]; 
    medObject.medication_name = rdr["medication_name"].ToString(); 
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]); 

    medsList[i].Add(medObject); 

    } 
    } 
    conn.Close(); 


} 
} 

MedicationTimelineClass medObjectx = medsList[0][0] as MedicationTimelineClass; 
MessageBox.Show(medObjectx.medication_name); 

여기에 무슨 일이 벌어지고 있습니까?

+0

이전 코드를 보여줘야합니다. 그 코드와 관련이있을 수 있습니다. –

답변

3

루프 내에서 동일한 MedicationTimelineClass 객체를 재사용하는 것처럼 보입니다. 귀하의 클래스는 참조 유형이라는 것을 기억하십시오. 기본적으로 목록에 동일한 참조를 추가하고 해당 참조에있는 객체에 저장된 속성 값을 업데이트합니다. 궁극적으로 목록의 모든 "항목"은 동일한 개체를 참조합니다.

각 반복마다 새 MedicationTimelineClass 객체를 인스턴스화 한 다음 해당 새 객체를 목록에 추가하십시오.

+0

나는 그 사람에게 다시 떨어 졌다는 것을 믿을 수 없다. 일주일 전에 똑같은 문제가 있었어. 나를 부끄럽게 여기다. – jello

2

"while (rdr.Read())"루프에서 매번 동일한 객체 (medObject)를 목록에 추가하는 것입니다. 목록은 동일한 개체로 계속해서 채워지는입니다.