0

getconnectionstring、executescalar、executenonquery、doselect などの一般的なデータベース メソッドを含む基本的な dll があります。(vb.net または c#) と oracle を使用しています。ここで、2 ~ 3 個の SQL があり、すべてが機能する場合にのみコミットする必要があるトランザクションのメソッドを作成する必要があります。私はそれを行う方法を見ようとしています。sql2および/またはsql3に挿入するために使用されるある種の一意のフィールドを返すには、sql1が必要です。

  private sub executeTransaction(byval sql1 as string,byval sql2 as string,byval sql3 as string)

       code to begin transaction
       execute sql1 returning unique id to a local field    'since this id may be different based on sql, how to handle this?
       execute sql2
       execute sql3 optional
       if exception rollback 
       commit on finally block and then close the connection object

  end sub

上記の方法を書くための提案/ベストプラクティスを探しています。前もって感謝します。

4

1 に答える 1

1

パターンは次のとおりです。

  • 接続からトランザクションを作成する
  • そのトランザクションを各コマンドに割り当てます
  • 完了したらコミット/ロールバック


using(OracleConnection conn = new OracleConnection())
{
    using(DbTransaction transaction = conn.BeginTransaction())
    {
        try
        {
            // .... create a command 
            cmd1 = new OracleCommand({sql to get a value});
            cmd1.Transaction = transaction;
            cmd1.ExecuteScalar();

            // .... create another command 
            cmd1 = new OracleCommand({sql to update a value});
            cmd2.Transaction = transaction;
            cmd2.ExecuteNonQuery();

            transaction.Commit();  
        }
        catch (Exception err)
        {
            transaction.Rollback();
            throw err;   // or just throw; to preserve the deeper stack trace
        }
    }
}
于 2013-04-30T15:54:17.140 に答える