1

このコードはしっかりしていますか?「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;
}

ありがとう

4

1 に答える 1

1

はい、それは本当です。各SQLiteのネストされていないコマンドはトランザクションにネストされています。そのため、結果をフェッチせずに複数のクエリを実行する必要がある場合は、トランザクションを明示的に開始し、クエリを実行し、コミットすることで多くのメリットが得られます。

于 2010-03-18T02:57:06.993 に答える