3

Excel から DataTable にデータをエクスポートしていますが、Excel ファイルに大量の行が含まれているとパフォーマンスの問題が発生します...

public DataView LoadFromExcel()
{
    Microsoft.Office.Interop.Excel.Application application = 
                           new Microsoft.Office.Interop.Excel.Application();
    Workbook workbook = null;
    Worksheet worksheet = null;
    string filename = null;
    OpenFileDialog file = new OpenFileDialog();
    if (true == file.ShowDialog())
    {
        filename = file.FileName;
    }
    workbook = application.Workbooks.Open(filename, true, true);
    worksheet = workbook.Sheets[1];
    Range range = worksheet.UsedRange;
    int row = range.Rows.Count;
    int columns = range.Columns.Count;
    System.Data.DataTable dt = new System.Data.DataTable();
    for (int i = 1; i <= columns; i++)
    {
        dt.Columns.Add((range.Cells[1, i] as Range).Value2.ToString());
    }
    for (row = 2; row <= range.Rows.Count; row++)
    {
        DataRow dr = dt.NewRow();
        for (int column = 1; column <= range.Columns.Count; column++)
        {
            dr[column - 1] = (range.Cells[row, column] as
                    Microsoft.Office.Interop.Excel.Range).Value2.ToString();
        }
        dt.Rows.Add(dr);
        dt.AcceptChanges();
    }
    workbook.Close(true, Missing.Value, Missing.Value);
    application.Quit();
    return dt.DefaultView;
}

この問題を解決する方法はありますか? 助けてください。

4

4 に答える 4

1

SQL 一括コピーを使用して、このような操作を実行できます。

于 2013-05-28T07:02:09.540 に答える
1

これは正しいアプローチではないと思います。

大量のデータをテーブルに挿入するには、データベースの「一括挿入」機能を使用する必要があります。一括挿入中は、データベース ログとロールバック機能をオフにする必要があります。そうしないと、一括挿入は通常の挿入の束と同じように機能します。

Oracle と SQL Server にはこの機能があり、一部の NoSQL データベースにもこの機能があることは知っています。データベースが何であるかについて言及していないので、グーグルで検索すると役立ちます。

于 2013-05-28T07:11:35.143 に答える
1

OLEDb プロバイダーの助けを借りてそれを行うことができます。私は50000レコードのためにやってみました。以下のコードを試してみてください。

        // txtPath.Text is the path to the excel file.
        string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + txtPath.Text + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\"";

        OleDbConnection oleCon = new OleDbConnection(conString);

        OleDbCommand oleCmd = new OleDbCommand("SELECT field1, field2, field3 FROM [Sheet1$]", oleCon);

        DataTable dt = new DataTable();

        oleCon.Open();
        dt.Load(oleCmd.ExecuteReader());
        oleCon.Close();

いくつかのことに注意する必要があります。

  1. シートの名前は Sheet1 にするか、クエリで適切な名前を付けます。
  2. シートを読んでいる間、シートを開いてはいけません。
  3. 列名はクエリで適切に定義する必要があります
  4. 列名はシートの最初の行にある必要があります

お役に立てば幸いです...さらに必要なものがあれば教えてください... :)

于 2013-05-28T07:00:47.657 に答える
-1

データベースに影響を与える可能性のある間違った値の送信を避けるために、変数に値を読み取っていくつかのフィルターを実行してみてください。不明なデータをデータベース、特に MS SQL に保存するのは間違っています。保存を容易にし、DB の状態を維持するためにフィルタリングを行ってください。

于 2013-05-28T07:00:20.370 に答える