所以我试图将值存储在C#winForms的Lists数组中。在我制作sql语句的for循环中,一切正常:消息框每次都输出一个不同的药物名称。
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);
}
}
然后,当我从循环中取出消息框代码时,意味着应该填充Lists数组,我总是得到相同的值:输入的最后一个值。相同的药物名称,无论我放在这些括号之间的数字。就好像整个Lists数组都填充了相同的数据。
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对象,然后将该新对象添加到列表中。
答案 1 :(得分:2)
在“while(rdr.Read())”循环中,您每次只是将相同的对象(medObject)添加到列表中。列表 一遍又一遍地填充相同的对象。