使用foreach循环将不同类型的列表插入SQL Server数据库

时间:2016-01-20 19:10:04

标签: c# sql sql-server

我尝试使用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();
    }
}

提前致谢!

3 个答案:

答案 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将其插入到数据库中。

DatTable

Quick Example of Datatables

SqlBulkCopy