关于在while循环中覆盖数据

时间:2013-03-07 00:04:30

标签: c# list

我输出到WebGrid有问题,因为我的列表被覆盖了,所以到最后,我为网格上的每一行写了最后一行数据。我必须使用while循环,因为数据不断被添加到,我们正在查看很多数据,所以我不想写入另一个列表。

public class ChemData
{
    string strSQLconnection = "Server=Server;Database=data;Uid=Username;Pwd=Password";

    public int productId { get; set; }
    public string productName { get; set; }

    public List<ProdData> ProdList = new List<ProdData>();

    public List<ProdData> ProdDataPull()
    {
        ProdData Analysis = new ProdData();
        SqlDataReader reader = null;
        SqlConnection conn = new SqlConnection(strSQLconnection);
        SqlCommand query = new SqlCommand("Select * from producttable");

        conn.Open();
        query.Connection = new SqlConnection(strSQLconnection);
        query.Connection.Open();
        reader = query.ExecuteReader();
        while (reader.Read())
        {
            if (!reader.IsDBNull(0)) Analysis.productId = reader.GetInt32(0);
            if (!reader.IsDBNull(1)) Analysis.productName = reader.GetString(1);

            ProdList.Add(Analysis);
         } 
         return ChemList;
   } 
 }

1 个答案:

答案 0 :(得分:2)

这是因为Analysis只创建一次。每次将其添加到列表中都会添加对同一对象的引用。将创建移动到while循环内部应解决此问题

while (reader.Read())
{
    ProdData Analysis = new ProdData();
    if (!reader.IsDBNull(0)) Analysis.productId = reader.GetInt32(0);
    if (!reader.IsDBNull(1)) Analysis.productName = reader.GetString(1);

    ProdList.Add(Analysis);
}

这会在循环的每次迭代中创建一个新的ProdData对象,并将其分配给Analysis,然后更新其内容并将该引用添加到列表中。

在循环外Analysis创建Analysis继续指向同一个ProdData对象,该对象会反复添加到列表中,而每次都会覆盖其值。 / p>

请参阅:Reference Types vs. Value Types