Какой самый быстрый способ вставить 100 000 записей в файл MDB в С#

Я знаю, что эти вопросы довольно общие, но я искал весь день, и я не смог найти правильный способ сделать это.

Вот мой код, чтобы вставить около 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();

Этот код занимает около минуты, чтобы работать. Это нормально? Каков правильный способ сделать это быстрее?

+2
источник поделиться
3 ответа

Если у вас уже есть "таблица чисел" (с не менее 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"

создал 100 000 строк менее чем за 2 секунды.

Однако, если у вас еще нет таблицы чисел, вам нужно сначала создать эту таблицу, поэтому, если это одноразовое требование, вам может быть лучше оптимизировать ваш код.

Код, опубликованный в вашем вопросе, занял 45 секунд на моей машине. Два улучшения, которые значительно сократили время выполнения:

  1. Используйте .Prepare(): это само по себе сократило истекшее время до 16 секунд

  2. Использование OleDbTransaction: 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));
+5
источник

(Бонусный ответ :)

В случае, если кто-то задается вопросом, может ли OleDbDataAdapter быстрее вставлять строки, это, похоже, не так. Следующий код создает 100 000 записей...

var da = new OleDbDataAdapter("SELECT [ID], [Title], [Price], [Tag], [Author] FROM [tblBooks] WHERE False", con);
var cb = new OleDbCommandBuilder(da);
cb.QuotePrefix = "["; cb.QuoteSuffix = "]";
var dt = new System.Data.DataTable();
da.Fill(dt);
for (int i = 0; i < 100000; i++)
{
    System.Data.DataRow dr = dt.NewRow();
    dr["Title"] = "Dummy Text 1";
    dr["Price"] = 10;
    dr["Tag"] = "Dummy Text 2";
    dr["Author"] = "Dummy Text 3";
    dt.Rows.Add(dr);
}
da.Update(dt);

... но это займет около 30% дольше, чем исходный код в вопросе.

+2
источник
другие ответы

Связанные вопросы


Похожие вопросы

Таблицу чисел можно использовать для добавления нескольких одинаковых строк, например:

INSERT INTO aTable ( aText, aNumber )
SELECT @param1 , @param2 
FROM Numbers
WHERE Numbers.Number<1000

Таблица чисел:

Number
0
1
2
<...>
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос