2017-07-13 10 views
0

複数のデータを挿入する際の時間を短縮する方法を教えてください。挿入をスピードアップする - 一度にリストを挿入する

私はExcelからデータを取得し、リストに保存します。私のループでは、私はすべての行の接続を開き、私は私の挿入機能で閉じる。挿入関数は、行ごとにデータを挿入します。時にはこの操作に多くの時間がかかることがあります。この

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を作成し、一度にリストを挿入する方法はありますか?任意のアイデアは、この操作をスピードアップする方法?

+0

'' 'cmpList'''とは何ですか?わかったら、適切な措置を勧めることができるはずです。例えば。コレクションをコンカレントに変換し、同時に多くの異なるタスクから挿入します。 '' 'cmpList'''の内容によっては、それをコンカレントコレクションにする必要さえないかもしれません。 –

+0

[mysqlで複数の行を挿入する]の複製があります(https://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql) –

+0

@JonathanDavidArndtなぜそう思いますか? –

答えて

3

パフォーマンスの問題を引き起こす原因はさまざまです。あなたはC#側でSQLステートメントを使用するよりも速くなるストアドプロシージャを使用しています。しかしながら;各行の接続を作成するにはコストがかかります。 1つの接続を保持し、挿入を実行することを考慮する必要があります(接続のタイムアウトを避けるために注意してください)。ストアドプロシージャを無視できる場合は、SqlBulkCopyなどのバッチ挿入オプションに従うか、挿入ステートメントごとに1000項目のカスタムSQL挿入ステートメントを作成することもできます。

「この操作には時間がかかることがあります」という記述があるため、データベースサーバーの負荷、制約、トリガーなどの問題が発生する可能性があります。パフォーマンス上の問題を引き起こす可能性のあるトリガーや制約を避けるべきです。 this postのように一時的に制約を回すことで確認できます。

+0

アドバイスありがとう!私はSqlBulkCopyを探します。 –

関連する問題