我尝试使用foreach循环将数据添加到数据库中,以迭代包含不同类型值的列表。
List<string> productCodeList = new List<string>();
List<string> productNameList = new List<string>();
List<string> productPriceList = new List<string>();
List<int> competitorList = new List<int>();
List<DateTime> dateCreatedList = new List<DateTime>();
有没有办法迭代不同类型的多个列表?因为目前我只能将一个列表插入一列。我想要的是将数据插入到指定的所有列。
或者可能有更好的方法吗?
using (var con = new SqlConnection(connectionString))
{
con.Open();
using (var cmd = new SqlCommand(@"INSERT INTO OnlineProductsTemp$(CompetitorID, ProductCode, ProductName, Price, DateCreated)
VALUES(@CompetitorID, @ProductCode, @ProductName, @Price, @DateCreated)", con))
{
cmd.Parameters.Add("@CompetitorID", SqlDbType.Int);
cmd.Parameters.Add("@ProductCode", SqlDbType.VarChar);
cmd.Parameters.Add("@ProductName", SqlDbType.VarChar);
cmd.Parameters.Add("@Price", SqlDbType.Decimal);
cmd.Parameters.Add("@DateCreated", SqlDbType.DateTime);
foreach (var value in competitorList)
{
cmd.Parameters["@CompetitorID"].Value = value;
int rowsAffected = cmd.ExecuteNonQuery();
}
competitorList.Clear();
}
}
提前致谢!
答案 0 :(得分:2)
你有逻辑上相关的属性,如名称,代码等,分成多个列表,这些列表很难维护,并且像@Santiago所指出的那样容易出错。
如果您完全控制代码,可以考虑创建一个Product
类并拥有一组产品。
public class Product
{
public string Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int CompetitorId { get; set; }
public DateTime DateCreated { get; set; }
}
public class DemoClass
{
public static void Demo()
{
var products = new List<Product>();
// fill the list here
using (var con = new SqlConnection(connectionString))
{
con.Open();
using (var cmd = new SqlCommand(@"INSERT INTO OnlineProductsTemp$(CompetitorID, ProductCode, ProductName, Price, DateCreated)
VALUES(@CompetitorID, @ProductCode, @ProductName, @Price, @DateCreated)", con))
{
cmd.Parameters.Add("@CompetitorID", SqlDbType.Int);
cmd.Parameters.Add("@ProductCode", SqlDbType.VarChar);
cmd.Parameters.Add("@ProductName", SqlDbType.VarChar);
cmd.Parameters.Add("@Price", SqlDbType.Decimal);
cmd.Parameters.Add("@DateCreated", SqlDbType.DateTime);
foreach (var p in products)
{
cmd.Parameters["@CompetitorID"].Value = p.CompetitorId;
cmd.Parameters["@ProductCode"].Value = p.Code;
cmd.Parameters["@ProductName"].Value = p.Name;
cmd.Parameters["@Price"].Value = p.Price;
cmd.Parameters["@DateCreated"].Value = p.DateCreated;
var rowsAffected = cmd.ExecuteNonQuery();
}
products.Clear();
}
}
}
}
答案 1 :(得分:1)
我想你想要这样的东西:
for (int i = 0; i < competitorList.Count; i++)
{
cmd.Parameters["@CompetitorID"].Value = competitorList[i];
cmd.Parameters["@ProductCode"].Value = productCodeList[i];
cmd.Parameters["@ProductName"].Value = productNameList[i];
// etc
int rowsAffected = cmd.ExecuteNonQuery();
}
答案 2 :(得分:1)
将它们放在一个单独的列表中,很难确定哪个productCode与哪个productName一起使用。
我建议建立一个dto来处理这个问题。类似的东西:
public class Products
{
public string productCodeList {get; set;}
public string productNameList {get; set;}
public string productPriceList {get; set;}
public int competitorList {get; set;}
public DateTime dateCreatedList {get; set;}
}
比你可以使用:
List<Products> products = new List<Products>();
或者,您可以在代码中构建整个DataTable,并使用SqlBulckCopy将其插入到数据库中。