【问题标题】:OleDbCommand ExecuteNonQuery() performance issuesOleDbCommand ExecuteNonQuery() 性能问题
【发布时间】:2019-08-22 13:16:16
【问题描述】:

我目前正在尝试将大量数据集写入访问数据库。 不幸的是command.ExecuteNonQuery() 似乎很慢,我正在寻找更快的方法。

我一直在测量所有参数添加的执行时间, 但是包括所有这些的一次执行甚至不是一毫秒。所以这不是一个因素。 我也一直在尝试将所有语言和所有模块的所有页面放入一个列表中,这也没有任何区别。 另一方面,command.ExecuteNonQuery() 的一个执行时间平均为 200 毫秒。

这是我的代码:

using (OleDbConnection connection = new OleDbConnection(Program.connectionString))
            {
                using (OleDbCommand command = new OleDbCommand($"INSERT INTO {Program.NameOfDatabaseTable}([name],[language],[module],[path],[numberoflinks]) VALUES(@1, @2, @3, @4, @5)", connection))
                {
                    int counter = 0;
                    foreach (Language currlang in Program.Languages) {
                        ShowPercentProgress("Writing to Database... ", counter, Program.Languages.Count());
                        counter++;
                        foreach (Module currmodule in currlang.Modules) {
                            foreach(Page currpage in currmodule.pages) {

                                command.Parameters.Add(new OleDbParameter("@1", currpage.name));
                                command.Parameters.Add(new OleDbParameter("@2", currpage.language));
                                command.Parameters.Add(new OleDbParameter("@3", currpage.module));
                                command.Parameters.Add(new OleDbParameter("@4", currpage.path));
                                command.Parameters.Add(new OleDbParameter("@5", OleDbType.Integer) { Value = currpage.linklist.Count() });

                                command.ExecuteNonQuery();
                            }
                        }
                    }
                    Console.WriteLine("Writing Data to Database succesfull.");
                }
            }

我想知道是否有任何方法可以将多个数据集放在一个 command.ExecuteNonQuery() 中以减少运行时间。 作为一个附带问题:是否可以不将数据库表名直接插入 SQL 字符串(以避免 SQL 注入)?

【问题讨论】:

  • 您应该使用批量插入。在 for 循环中执行每个插入语句总是很慢。
  • 请显示相关表的CREATE TABLE,以便我们查看列名和数据类型。
  • 不幸的是,在 OleDB 中没有批量插入。

标签: c# ms-access oledb oledbcommand


【解决方案1】:

经过长时间的研究,我不得不接受 OleDb 根本不可能批量插入/提高性能。因此,我切换到 System.Data.SQLConnection 以使用批量插入并提高性能。我创建了一个 SQLite 数据库,而不是 Access。

因此,不要浪费时间尝试使用 Access。对于小型数据集访问可能是一种选择。但是当你有一个更大的数据集时,我建议你使用 SQLite。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2011-07-17
    • 2017-04-13
    • 2022-01-04
    • 2010-09-05
    相关资源
    最近更新 更多