【发布时间】: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