C# 加速插入-立即插入列表

C# 加速插入-立即插入列表,c#,mysql,sql,performance,C#,Mysql,Sql,Performance,如何在插入多个数据时加快时间 我从excel中获取数据,并将其存储在列表中。在我的循环中,我为每一行打开连接,然后用Insert函数关闭。插入函数逐行插入数据。有时这个操作需要很多时间。我的插入循环是这样的 private void btnSave_Click(object sender, RoutedEventArgs e) { if (cmpList.Count == 0) { MessageBoxHelper.ShowError("List can not

如何在插入多个数据时加快时间

我从excel中获取数据,并将其存储在列表中。在我的循环中,我为每一行打开连接,然后用Insert函数关闭。插入函数逐行插入数据。有时这个操作需要很多时间。我的插入循环是这样的

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    if (cmpList.Count == 0)
    {
        MessageBoxHelper.ShowError("List can not be inserted");
        return;
    }

    foreach (var item in cmpList)
    {
        item.StartDate = dpStart.SelectedDate.Value;
        item.FinishDate = dpFinish.SelectedDate.Value;
        item.Insert();
    }

    MessageBoxHelper.ShowInformation("List was inserted successfully!");
    comboCampaignType.IsEnabled = true;
}
for (int i=0; i<excelRowCount; i++)
{
    Campaign cmp = new Campaign();
    cmp.Type = 1;
    cmp.PriceP.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
    cmp.PriceV.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
    cmp.PriceP.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
    cmp.PriceV.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
    cmp.MinOrder = Convert.ToDouble((string)sheet.GetRow(row).GetCell(3).Value);
    cmpList.Add(cmp);
}
我从excel中为所有行创建cmpList,如下所示

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    if (cmpList.Count == 0)
    {
        MessageBoxHelper.ShowError("List can not be inserted");
        return;
    }

    foreach (var item in cmpList)
    {
        item.StartDate = dpStart.SelectedDate.Value;
        item.FinishDate = dpFinish.SelectedDate.Value;
        item.Insert();
    }

    MessageBoxHelper.ShowInformation("List was inserted successfully!");
    comboCampaignType.IsEnabled = true;
}
for (int i=0; i<excelRowCount; i++)
{
    Campaign cmp = new Campaign();
    cmp.Type = 1;
    cmp.PriceP.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
    cmp.PriceV.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
    cmp.PriceP.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
    cmp.PriceV.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
    cmp.MinOrder = Convert.ToDouble((string)sheet.GetRow(row).GetCell(3).Value);
    cmpList.Add(cmp);
}

<代码> >(int i=0;i)可能导致性能问题的不同原因。您使用的存储过程将比使用C语句中的SQL语句快。然而,为每一行创建连接代价也很高。您应该考虑保留单个连接并执行插入操作。(请记住,以避免连接超时)。如果您能够忽略存储过程,则应遵循批插入选项,如SqlBulkCopy,或者您甚至可以构建自定义SQL插入语句,如每个插入语句1000项


因为你说“有时这个操作需要很多时间”,问题可能是数据库服务器负载、约束、触发器等。您应该避免使用过多的触发器和约束,这可能会导致巨大的性能问题。您可以如中所述,通过临时打开约束进行检查。

可能会导致性能问题的原因不同。您使用的存储过程ICH将比在C端使用SQL语句要快,但是,为每一行创建连接也会花费很多。您应该考虑保留单个连接并执行插入(请记住避免连接超时)。。如果您能够忽略存储过程,则应遵循批插入选项,例如SqlBulkCopy,或者您甚至可以构建自定义SQL insert语句,例如每个insert语句1000项


因为你说“有时这个操作需要很多时间”,问题可能是数据库服务器负载、约束、触发器等。您应该避免使用过多的触发器和约束,这可能会导致巨大的性能问题。您可以通过临时打开约束进行检查,如中所述。

什么是
cmpList
?一旦我们发现,我们应该能够推荐适当的操作在上。例如,将集合转换为并发集合,并从多个不同的任务中并发插入。根据
cmpList
的不同,甚至可能不需要将其转换为并发集合。可能重复@JonathanDavidArndt为什么您这样认为?请尝试batchUpdate。没问题。如果它不是重复的,就不是重复的简单。从表面上看,另一个问题与你的问题有一些相同的考虑,但在不同的技术领域。只是想确保你看到了它。什么是
cmpList
?一旦我们发现了,我们应该能够推荐适当的操作。例如,将集合转换为并发集合,并同时插入fr许多不同的任务。根据
cmpList
是什么,甚至可能没有必要将其转换为并发集合。可能重复@JonathanDavidArndt为什么这样认为?尝试batchUpdate。没问题。如果它不是重复的,就不是重复的。从表面上看,另一个问题有一些与之相同的考虑你的是,但在另一个技术领域。只是想确保你看到它。谢谢你的建议!我将寻找SqlBulkCopy。谢谢你的建议!我将寻找SqlBulkCopy。