1

我在输出到 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;
   } 
 }
4

1 回答 1

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对象,该对象被一遍又一遍地添加到列表中,而其值每次都被覆盖。

请参阅:引用类型与值类型

于 2013-03-07T00:10:01.103 回答