1

次の方法を使用すると、ADO.NETを使用してOracleデータベースに対してトランザクションを実行できます。SQL Serverデータベースで同じコードを試してみると、次のエラーが表示されます。これの原因は何ですか?どのように修正できますか?

エラー:

ExecuteNonQueryでは、コマンドに割り当てられた接続が保留中のローカルトランザクションにある場合、コマンドにトランザクションが必要です。コマンドのTransactionプロパティが初期化されていません。

コード:

    /// <summary>
    /// A method to run transactional SQL on a database. Does not return a record set.
    /// </summary>
    /// <param name="transactions">A list of commands</param>
    /// <returns>A boolean indicator of success</returns>
    public bool ExecuteTransactionNonQuery(List<string> transactions)
    {
        if (transactions == null)
        {
            throw new ArgumentNullException("transactions");
        }

        PrepareConnection();

        DbTransaction dbTransaction = DBFactoryDatabaseConnection.BeginTransaction();

        try
        {
            foreach (var transaction in transactions)
            {

                DBFactoryDatabaseCommand.CommandText = transaction;
                DBFactoryDatabaseCommand.CommandType = CommandType.Text;
                DBFactoryDatabaseCommand.ExecuteNonQuery();
            }

            dbTransaction.Commit();
        }
        catch(Exception ex)
        {
            dbTransaction.Rollback();
            try
            {
                Close();
            }
            catch (Exception f)
            {
                throw new Exception("Error: Transaction execute failed on the database. " + ex.Message + ". Following that the application failed to close the connection. " + f.Message + ". ExecuteTransactionNonQuery().");
            }
            throw;
        }
        finally
        {
            dbTransaction.Dispose();
        }

        return true;
    }
4

1 に答える 1

2

トランザクションコマンドに割り当てる必要があります。

DBFactoryDatabaseCommand.Transaction = dbTransaction;
于 2012-08-15T14:33:33.763 に答える