このコードはしっかりしていますか?「using」などを使用しようとしました。基本的には、Sqlite データベースに対して実行する SQL コマンドのシーケンス リストとして渡す方法です。
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;
}
ありがとう