我试图将数据集中的数据添加到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
我的功能在做什么?
答案 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 :(得分: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;
}