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

Является ли этот код твердым? Я пытался использовать «использование» и т. Д. В основном метод для передачи в виде последовательного списка команд 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-й TRY

Как это?

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 Ответ

1 голос
/ 18 марта 2010

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

...