C# 如何将数据集中的数据放置到列表中

C# 如何将数据集中的数据放置到列表中,c#,list,dataset,C#,List,Dataset,我正在尝试将数据集中的数据添加到列表中。这是我在C中的函数 public List<ProductsDAL> GetAllProducts(string sqlQuery) { DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts"); List<ProductsDAL> bPList = new List<ProductsDAL>(); ProductsDALforeach (D

我正在尝试将数据集中的数据添加到列表中。这是我在C中的函数

  public List<ProductsDAL> GetAllProducts(string sqlQuery)
  {
     DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");
     List<ProductsDAL> bPList = new List<ProductsDAL>();
ProductsDALforeach (DataRow item in dsinsert.Tables[0].Rows)
     {
       this.Product_ID = item["Product_ID"].ToString();
       this.ProductDescr= item["ProductDescr"].ToString();
       bPList.Add(this);
     }
     return bPList;
  }
但我认为列表中的结果是:

column1 - colum2
D         1 
D         1
D         1
D         1
当我将这组数据插入另一个数据库时,我只得到以下信息:

column1 - colum2
D         1 

我在函数中做错了什么?

将当前对象this添加到列表中,然后在后续迭代中,通过this引用修改同一对象,然后再将其添加到列表中。这意味着您将得到一个列表,其中包含同一个对象,并且该对象会反复出现。其值将仅反映应用于它的最新值

相反,您要做的是每次将ProductsDAL的新实例添加到列表中,即,您应该创建一个新的ProductsDAL,设置其状态并将其添加到列表中,而不是对此进行修改

以下是您应该做的第一个更改:


public List GetAllProducts(string sqlQuery)
  {
     DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");
     List bPList = new List();
     foreach (DataRow item in dsinsert.Tables[0].Rows)
     {
       ProductsDAL product = new ProductsDAL();
       product.Product_ID = item["Product_ID"].ToString();
       product.ProductDescr = item["ProductDescr"].ToString();
       bPList.Add(product);
     }
     return bPList;
  }
此外:

由于此方法现在对当前ProductsDAL实例没有影响,它实际上正在创建新的实例,因此将其作为实例方法不再有意义。您可以考虑将其设为静态方法,并使GETDATA数据集静态化,或者将此逻辑移出到其他类,该类负责从数据库中获取产品。 您可能希望更改ProductsDAL上的构造函数,以便必须设置必填字段,以便无法创建未设置ID和描述的ProductsDAL对象。
您需要在foreach语句中创建一个新ProductsDAL。你只是在更新同一个。

我想你的问题在于你对这个的使用。我猜你是在产品课上做的

换成这个

public List<ProductsDAL> GetAllProducts(string sqlQuery)
  {
     DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");
     List<ProductsDAL> bPList = new List<ProductsDAL>();
     ProductsDAL p = null;
     ProductsDALforeach (DataRow item in dsinsert.Tables[0].Rows)
     {
       p =new ProductsDAL();
       p.Product_ID = item["Product_ID"].ToString();
       p.ProductDescr= item["ProductDescr"].ToString();
       bPList.Add(p);
     }
     return bPList;
  }

如果要反复使用同一对象,则需要重新创建该对象。我喜欢在另一个函数中分离代码。我会这样做:

首先,您应该获得这样的产品:

public IList<Product> GetProducts(string sortexpression)
{
  StringBuilder sql = new StringBuilder();
            sql.Append(" SELECT ProductName, ProductID");
            sql.Append("   FROM Products ");
            if (!string.IsNullOrEmpty(sortExpression))
                sql.Append(" ORDER BY " + sortExpression);

            DataTable dt = Db.GetDataTable(sql.ToString());

            return MakeProducts(dt);
}
为简单起见,我没有使用存储过程,但您应该……无论如何,您可能会问MakeProductsdt是什么样子的,这只是一个循环并添加到列表中的函数:

   private IList<Product> MakeProducts(DataTable dt)
    {
        IList<Product> list = new List<Product>();
        foreach (DataRow row in dt.Rows)
            list.Add(MakeProduct(row));

        return list;
    }

下面的方法行吗

public List<ProductsDAL> GetAllProducts(string sqlQuery) 
{ 
    return GetDataSet(sqlQuery, "tblProducts").
        Tables[0].Rows.Cast<System.Data.DataRow>().
        Select(p => new ProductsDAL()
        {
            Product_ID = p["Product_ID"].ToString(),
            ProductDescr = p["ProductDescr"].ToString()
        }).ToList();    
} 

另一种选择是使用LINQ访问数据集

public List<ProductsDAL> GetAllProducts(string sqlQuery) {
    DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");

    return (from row in dsinsert.Tables[0].AsEnumerable()
            select new ProductsDAL {
                Product_ID = row.Field<string>("Product_ID"),
                ProductDescr = row.Field<string>("ProductDescr"),
            }).ToList();
}
你可以这样试试

public static List<AttendenceManual> PreocessData(DataSet data)
        {
            List<AttendenceManual> _AttendenceManualList = new List<AttendenceManual>();

            for (int i = 0; i < data.Tables[0].Rows.Count; i++)
            {
                AttendenceManual Student = new AttendenceManual();
                Student.StrEmpID = data.Tables[0].Rows[i]["F2"].ToString();
                _AttendenceManualList.Add(Student);
            }

            return _AttendenceManualList;
        }
   private IList<Product> MakeProducts(DataTable dt)
    {
        IList<Product> list = new List<Product>();
        foreach (DataRow row in dt.Rows)
            list.Add(MakeProduct(row));

        return list;
    }
 private Product MakeProduct(DataRow row)
        {
            int productId = int.Parse(row["ProductId"].ToString());
            string name = row["ProductName"].ToString();

            return new Product(productId, name);
        }
public List<ProductsDAL> GetAllProducts(string sqlQuery) 
{ 
    return GetDataSet(sqlQuery, "tblProducts").
        Tables[0].Rows.Cast<System.Data.DataRow>().
        Select(p => new ProductsDAL()
        {
            Product_ID = p["Product_ID"].ToString(),
            ProductDescr = p["ProductDescr"].ToString()
        }).ToList();    
} 
public List<ProductsDAL> GetAllProducts(string sqlQuery) {
    DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");

    return (from row in dsinsert.Tables[0].AsEnumerable()
            select new ProductsDAL {
                Product_ID = row.Field<string>("Product_ID"),
                ProductDescr = row.Field<string>("ProductDescr"),
            }).ToList();
}
public static List<AttendenceManual> PreocessData(DataSet data)
        {
            List<AttendenceManual> _AttendenceManualList = new List<AttendenceManual>();

            for (int i = 0; i < data.Tables[0].Rows.Count; i++)
            {
                AttendenceManual Student = new AttendenceManual();
                Student.StrEmpID = data.Tables[0].Rows[i]["F2"].ToString();
                _AttendenceManualList.Add(Student);
            }

            return _AttendenceManualList;
        }