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 вложена в транзакцию. Так что, если вам нужно выполнить несколько запросов, не извлекая результат, есть большой выигрыш - явный запуск транзакции, выполнение ваших запросов и фиксация.