Как хранить массы данных в автономном режиме, а затем обновить их в базу данных SQLite в пакетном режиме? - PullRequest
3 голосов
/ 22 августа 2009

В настоящее время я пытаюсь заполнить базу данных SQLite десятками тысяч текстовых данных, используя этот метод:

SQLiteConnection = new SQLiteConnection(cntnStr);
connection.Open();

foreach(Page p in pages)
{
     using (SQLiteCommand command = new SQLiteCommand(String.Format("Insert Into Pages (ID, Data, Name) Values ({0}, '{1}', '{2}')", id, p.Data, p.Name), connection))
         command.ExecuteNonQuery();
}

Однако я подозреваю, что выполнение этого примерно 10 раз в секунду, вероятно, замедляет весь процесс. Есть ли способ, которым я могу сопоставить данные в памяти, а затем добавить каждые 5000 записей или около того в базу данных в пакетном режиме (так это быстрее)?

РЕДАКТИРОВАТЬ: Супер-важно: убедитесь, что вы выполняете все свои команды SQL в DbTransaction - в этом случае SQLiteTransaction:

SQLiteTransaction trans = connection.BeginTransaction();

// SQL centric code - repeated inserts/changes

trans.Commit(); // adds your changes

Улучшает производительность в 1000 раз.

Ответы [ 3 ]

6 голосов
/ 22 августа 2009

Использование параметризованного запроса вместо построения запроса с использованием конкатенации строк:

using (SQLiteConnection = new SQLiteConnection(cntnStr))
{
    connection.Open();

    string query = "Insert Into Pages (ID, Data, Name) Values (?, ?, ?)";
    using (SQLiteCommand command = new SQLiteCommand(query, connection)
    {
        command.Parameters.Add("id", DbType.Int32);
        command.Parameters.Add("data", DbType.String);
        command.Parameters.Add("name", DbType.String);
        foreach(Page p in pages)
        {
             command.Parameters["id"].Value = p.Id;
             command.Parameters["data"].Value = p.Data;
             command.Parameters["name"].Value = p.Name;
             command.ExecuteNonQuery();
        }
    }
}

Это будет быстрее, потому что DbCommand создается только один раз, а запрос анализируется только один раз. Кроме того, вы избегаете рисков внедрения SQL из-за конкатенации строк

Кстати, посмотрите на эту статью Роберта Симпсона (автора провайдера SQLite .NET)

0 голосов
/ 23 августа 2009

Вы можете загрузить таблицу из БД SQLite в объект DataTable , затем вставить свои записи в объект DataTable и синхронизировать ее каждые 5000 записей в БД.

0 голосов
/ 22 августа 2009

Вам придется самостоятельно обрабатывать экранирование данных, но вы можете использовать пакетную вставку.

IE:

Insert Into Pages (ID, Data, Name) Values (...),(...),(...),(...)
...