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;
}
感謝
出於對後續讀者的興趣,在有和沒有交易的情況下運行計時測試,請使用「System.Diagnostics.Stopwatch」(http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch .aspx)而不是'DateTime'等。將結果以問題形式發佈以供參考... PK :-) –
哦,那你是說我的代碼不會被事務處理? – Greg
@Greg:如果您未指定事務,則每個查詢都將成爲單個事務。 – MPelletier