在C#中将100 000条记录插入MDB文件的最快方法是什么?

Vah*_*hid 2 c# oledb ms-access

我知道这些问题相当普遍,但我整天都在搜索,但我找不到合适的方法.

这是我的代码,使用C#将大约100 000个虚拟记录插入到MDB文件中.

OleDbConnection con = new OleDbConnection();
string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
string dbSource = "Data Source = D:/programming/sample.mdb";
con.ConnectionString = dbProvider + dbSource;
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO tblBooks (Title, Price, Tag, Author) VALUES (@title, @price, @tag, @author)";
cmd.Parameters.AddWithValue("@title", "Dummy Text 1");
cmd.Parameters.AddWithValue("@price", 10);
cmd.Parameters.AddWithValue("@tag", "Dummy Text 2");
cmd.Parameters.AddWithValue("@author", "Dummy Text 3");
con.Open();

for (int i = 0; i < 100000; i++)
{
    cmd.ExecuteNonQuery();    
}

 con.Close();
Run Code Online (Sandbox Code Playgroud)

此代码大约需要一分钟才能运行.这是正常的吗?更快地做到这一点的正确方法是什么?

Gor*_*son 5

如果你碰巧已经有了一个"数字表"(至少有100,000行),那么Remou的答案几乎肯定会让你的工作最快完成.我尝试了在VBA和查询中的快速测试

Dim t0 As Single
t0 = Timer
CurrentDb.Execute _
        "INSERT INTO tblBooks (Title, Price, Tag, Author) " & _
        "SELECT 'Dummy Text 1', 10, 'Dummy Text 2', 'Dummy Text 3' FROM Numbers", _
        dbFailOnError
Debug.Print Format(Timer - t0, "0.0") & " seconds"
Run Code Online (Sandbox Code Playgroud)

在不到2秒的时间内创建了100,000行.

但是,如果您还没有数字表,那么您需要首先创建该表,因此如果这是一次性要求,那么您可能最好只是优化代码.

您的问题中发布的代码在我的机器上花了45秒.两项显着缩短执行时间的增强功能包括:

  1. 使用.Prepare():仅此一项就将经过的时间减少到16秒

  2. 使用OleDbTransaction:在事务中包装插入(除了使用之外.Prepare())还将经过的时间进一步减少到10秒.

修改后的代码如下所示:

var sw = new System.Diagnostics.Stopwatch();
sw.Start();
OleDbConnection con = new OleDbConnection();
string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
string dbSource = "Data Source = C:/Users/Gord/Desktop/speed.mdb";
con.ConnectionString = dbProvider + dbSource;
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO tblBooks (Title, Price, Tag, Author) VALUES (?,?,?,?)";
cmd.Parameters.Add("?", OleDbType.VarWChar, 255);
cmd.Parameters.Add("?", OleDbType.Currency);
cmd.Parameters.Add("?", OleDbType.VarWChar, 255);
cmd.Parameters.Add("?", OleDbType.VarWChar, 255);
cmd.Prepare();
cmd.Parameters[0].Value = "Dummy Text 1";
cmd.Parameters[1].Value = 10;
cmd.Parameters[2].Value = "Dummy Text 2";
cmd.Parameters[3].Value = "Dummy Text 3";
OleDbTransaction trn = con.BeginTransaction();
cmd.Transaction = trn;
for (int i = 0; i < 100000; i++)
{
    cmd.ExecuteNonQuery();
}
trn.Commit();
con.Close();
sw.Stop();
Console.WriteLine(String.Format("{0:0.0} seconds", sw.ElapsedMilliseconds / 1000.0));
Run Code Online (Sandbox Code Playgroud)