如何将数据从DataSet放入List

时间:2010-03-10 18:01:26

标签: c# list dataset

我试图将数据集中的数据添加到List中。这是我在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
A         1 
B         2
C         3
D         4

但我认为列表中的结果是:

column1 - colum2
D         1 
D         1
D         1
D         1

当我将这组数据插入另一个数据库时,我只能得到这个:

column1 - colum2
D         1 

我的功能在做什么?

8 个答案:

答案 0 :(得分:2)

您正在将当前对象this添加到列表中,然后在后续迭代中,您将修改同一对象(通过this引用),然后再将其添加到名单。这意味着您最终会反复使用包含相同对象(this对象)的列表。其值仅反映应用于它的最新值。

您想要做的是每次都将新的ProductsDAL实例添加到列表中,即不是修改this,而是应该创建一个新的ProductsDAL,设置其状态并将其添加到列表中。 / p>

这是你应该做的第一个改变:


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;
  }

此外:

  1. 因为这个方法现在对当前的ProductsDAL实例没有影响(它实际上是在创建新的实例),所以它不再是一个实例方法。您可以考虑将其设置为静态方法(并将GetDataSet()设置为静态)或将此逻辑移至其他负责从数据库中提取产品的类中。
  2. 您可能希望更改ProductsDAL上的构造函数,以便必须设置必填字段,以便无法创建没有设置其ID和描述的ProductsDAL对象。

答案 1 :(得分:2)

您需要在foreach语句中创建一个新的ProductsDAL。你刚刚更新了同一个。

答案 2 :(得分:2)

我认为你的问题是你的用法。我的猜测是你在产品类中这样做

将其更改为此

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;
  }

答案 3 :(得分:1)

另一种选择是使用LINQ to DataSets ......

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();
}

答案 4 :(得分:0)

1. public List<ProductsDAL> GetAllProducts(string sqlQuery)
2. {
3.     DataSet dsinsert = GetDataSet(sqlQuery, "tblProducts");
4.     List<ProductsDAL> bPList = new List<ProductsDAL>();
5.     ProductsDALforeach (DataRow item in dsinsert.Tables[0].Rows)
6.     {
7.       this.Product_ID = item["Product_ID"].ToString();
8.       this.ProductDescr= item["ProductDescr"].ToString();
9.       bPList.Add(this);
10.     }
11.    return bPList;
12. }

我认为 9 行可能会导致问题。相反(替换第7-9行),我可能会做以下几点:

ProductDAL productDal = new ProductsDAL(){
                          Product_ID = item["Product_ID"].ToString(),
                          ProductDescr =  item["ProductDescr"].ToString()};
bPList.Add(productDal);

答案 5 :(得分:0)

您一遍又一遍地重复使用同一个对象,您需要重新创建该对象。我喜欢在另一个函数中分离代码。我将如何做到这一点:

首先你应该得到这样的产品:

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);
}

所以你可能会问Db.GetDataTable是怎么看的,就像这样:

 public static DataTable GetDataTable(string sql)
        {
            using (DbConnection connection = factory.CreateConnection())
            {
                connection.ConnectionString = connectionString;

                using (DbCommand command = factory.CreateCommand())
                {
                    command.Connection = connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = sql;

                    using (DbDataAdapter adapter = factory.CreateDataAdapter())
                    {
                        adapter.SelectCommand = command;

                        DataTable dt = new DataTable();
                        adapter.Fill(dt);

                        return dt;
                    }
                }
            }

为了简单起见,我没有使用sprocs,但你应该......无论如何你可能会问MakeProducts(dt)是什么样的,这只是一个循环并添加到列表中的函数:

   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);
        }

答案 6 :(得分:0)

以下是否有效?

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();    
} 

答案 7 :(得分:0)

您可以尝试这样

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;
        }