2010-03-18 1 views
1

Является ли этот код прочным? Я попытался использовать «использование» и т. Д. В принципе, метод для передачи в виде упорядоченного списка SQL-команд для работы с базой данных Sqlite.sqlite - любые улучшения для этого прилагаемого кода (выполняется несколько транзакций sql транзакций в sqlite)

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

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

первый TRY

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; 
} 

третьего 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

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

+1

. Из интереса для последующих читателей выполняется проверка времени с транзакцией и без нее, используйте «System.Diagnostics.Stopwatch» (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch .aspx) не 'DateTime' и т. д. Опубликуйте результаты с вопросом для справки ... PK :-) –

+0

О, так вы говорите, что мой код не будет обрабатываться транзакционно? – Greg

+0

@Greg: Если вы не укажете транзакцию, каждый запрос станет одной транзакцией. – MPelletier