C #: SQLiteDataAdapter INSERT медленный - PullRequest
0 голосов
/ 15 мая 2018

У меня есть JSON-файл с ~ 25-30 КБ элементов, которые я хочу сохранить в базе данных sqlite.Однако время, необходимое классу SQLiteDataAdapter для обновления базы данных с помощью объекта DataTable, содержащего все элементы, составляет около 35 минут для 15-килобайтных элементов.Производительность выполняемых обновлений ограничена UpdateBatchSize, который в моем случае равен 1, и когда я пытаюсь изменить его, я получаю исключение, которое говорит: «Указанный метод не поддерживается».

Вот метод Update:

        public async Task<bool> SaveTable()
    {
        SQLiteDataAdapter data_adapter = null;
        try
        {

            data_adapter = new SQLiteDataAdapter(sql_cmd);
            data_adapter.UpdateBatchSize = 10;
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }

        try
        {
            SQLiteCommandBuilder cmd_bldr = new SQLiteCommandBuilder(data_adapter);
            data_adapter.InsertCommand = cmd_bldr.GetInsertCommand();
            Console.WriteLine(data_adapter.InsertCommand.CommandText);
            data_adapter.AcceptChangesDuringUpdate = true;
            data_adapter.UpdateCommand = data_adapter.InsertCommand;
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }

        try
        {
            var size = data_adapter.UpdateBatchSize;
            Console.WriteLine("Updating Table. Batch Size: " + size);
            var rows_updated = data_adapter.Update(data_table);
            Console.WriteLine("Rows Updated: " + rows_updated.ToString());
            data_adapter.Dispose();
        }
        catch(Exception e)
        {
            Console.WriteLine("Exception Thrown: " + e.Message);
            return false;
        }
        return true;
    }

Есть ли способ изменить UpdateBatchSize или увеличить количество обновлений в секунду?

1 Ответ

0 голосов
/ 15 мая 2018

Я думаю, что ваш подход к использованию SQLiteDataAdapter неправильный.Свойство UpdateBatchSize не реализовано соединителем SQLite и поэтому не может быть изменено.Значение по умолчанию 1 означает, что функциональность пакета обновления отключена.Таким образом, при запросе на обновление адаптер вынужден запускать медленный процесс на одну строку на одну строку.

Наилучший подход - вручную выполнить каждую отдельную команду вставки, но заключить их в транзакцию

// Getting the command text from the SQLiteCommandBuilder, but at this
// point you could simply write it as text directly in the constructor
SQLiteCommandBuilder cmd_bldr = new SQLiteCommandBuilder(data_adapter);
using (var cmd = new SQLiteCommand(cmd_bldr.GetInsertCommand(), conn))
{
    conn.Open();

    // Create the parameters collection, setting the type for each 
    // parameter but without setting an explicit value
    cmd.Parameters.Add("@p1", DbType.Int);
    // create other parameters for each field to insert ....

    using (var transaction = conn.BeginTransaction())
    {
        // Inform the command about the open transaction
        cmd.Transaction = transaction;

        // Loop over your table rows....
        foreach(DataRow row in data_table.Rows)
        {
            // get the parameters value from the row's field
            cmd.Parameters["@p1"].Value = row[fieldIndex];
            .... repeat for other parameters ...

            cmd.ExecuteNonQuery();
        }
        transaction.Commit();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...