2010-03-18 18 views
1

此代碼是否固定?我試圖使用「使用」等。基本上是一種方法來傳遞SQL命令的序列列表,以針對Sqlite數據庫運行。sqlite - 對此附加代碼的任何改進(在sqlite中以事務方式運行多個sql命令)

我認爲在默認情況下,在sqlite默認情況下,所有運行在單個連接中的命令都是事務處理的?這是真的?即我不應該(現在還沒有進入代碼)BeginTransaction或CommitTransaction。

它使用http://sqlite.phxsoftware.com/作爲sqlite ADO.net數據庫提供程序。

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

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

是的,這是真的,每個SQLite的嵌套的命令嵌套在一個事務。因此,如果您需要運行多個查詢,而無需獲取結果,則明確啓動事務,執行查詢和提交操作會有很大收益。

+1

出於對後續讀者的興趣,在有和沒有交易的情況下運行計時測試,請使用「System.Diagnostics.Stopwatch」(http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch .aspx)而不是'DateTime'等。將結果以問題形式發佈以供參考... PK :-) –

+0

哦,那你是說我的代碼不會被事務處理? – Greg

+0

@Greg:如果您未指定事務,則每個查詢都將成爲單個事務。 – MPelletier