2010-03-10 66 views
2

我試圖將數據集中的數據添加到列表中。這是我在C#功能如何將DataSet中的數據放置到列表中

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 

我在做什麼錯在我的功能?

回答

2

您正在將當前對象this添加到列表中,然後在隨後的迭代中,您將同一對象(通過this引用)修改後再次添加到列表中。這意味着您最終會重複一次包含同一對象(this對象)的列表。其值將僅反映應用於它的最新值。

你想要做的是每次將新的ProductsDAL實例添加到列表中,而不是修改this,而應該創建一個新的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; 
    } 

另外:

  1. 因爲這種方法現在已經對當前ProductsDAL實例(它實際上創造新的),那麼它沒有影響不再有意義的是它是一個實例方法。你可以考慮把它作爲一個靜態方法(並且使GetDataSet()也是靜態的),或者將這個邏輯轉移到其他一些具有從數據庫中獲取產品的類中。
  2. 您可能需要更改ProductsDAL上的構造函數,以便必須設置必填字段,以便無法創建未設置其ID和說明的ProductsDAL對象。
2

您需要在foreach語句中創建一個新的ProductsDAL。你只是更新相同的一個。

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

我覺得行可能會導致問題。相反(更換7-9行),我可能會做線沿線的東西:

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

你是在重複使用相同的對象,並且,你需要重新創建該對象。我喜歡在另一個功能分離代碼。這裏是我會怎麼做:

首先,你應該的getProducts像這樣:

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

另一種選擇是使用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(); 
} 
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; 
     } 
相關問題