sqlite - любые улучшения для этого кода присоединения (выполнение нескольких команд sql транзакционно в sqlite)

Твердый ли этот код? Я пытался использовать "использование" и т. Д. В основном метод для передачи в виде последовательного списка команд SQL для запуска в базе данных Sqlite.

Я предполагаю, что это правда, что в sqlite по умолчанию все команды, запущенные в одном соединении, обрабатываются транзакционно? Это правда? т.е. я не должен был (и не получил в коде на данный момент) BeginTransaction или CommitTransaction.

Он использует http://sqlite.phxsoftware.com/ в качестве поставщика базы данных sqlite ADO.net.

1-й ПОПЫТКА

private int ExecuteNonQueryTransactionally(List<string> sqlList)
{
    int totalRowsUpdated = 0;

    using (var conn = new SQLiteConnection(_connectionString))
    {
        // Open connection (one connection so should be transactional - confirm)
        conn.Open();

        // Apply each SQL statement passed in to sqlList
        foreach (string s in sqlList)
        {
            using (var cmd = new SQLiteCommand(conn))
            {
                cmd.CommandText = s;
                totalRowsUpdated = totalRowsUpdated + cmd.ExecuteNonQuery();
            }
        }
    }

    return totalRowsUpdated;
}

3-й ПОПЫТКА

Как это?

private int ExecuteNonQueryTransactionally(List<string> sqlList)
{
    int totalRowsUpdated = 0;

    using (var conn = new SQLiteConnection(_connectionString))
    {
        conn.Open();
        using (var trans = conn.BeginTransaction())
        {

            try
            {
                // Apply each SQL statement passed in to sqlList
                foreach (string s in sqlList)
                {
                    using (var cmd = new SQLiteCommand(conn))
                    {
                        cmd.CommandText = s;
                        totalRowsUpdated = totalRowsUpdated + cmd.ExecuteNonQuery();
                    }
                }

                trans.Commit();
            }
            catch (SQLiteException ex)
            {
                trans.Rollback();
                throw;
            }


        }
    }
    return totalRowsUpdated;
}

Спасибо

1 ответ

Да, это правда, каждая необъявленная команда SQLite вложена в транзакцию. Так что, если вам нужно выполнить несколько запросов, не извлекая результат, есть большой выигрыш - явный запуск транзакции, выполнение ваших запросов и фиксация.

Другие вопросы по тегам