internal OleDbTransaction ValidateTransaction(OleDbTransaction transaction, string method)
 {
     if (this.weakTransaction != null)
     {
         OleDbTransaction target = (OleDbTransaction)this.weakTransaction.Target;
         if ((target != null) && this.weakTransaction.IsAlive)
         {
             target = OleDbTransaction.TransactionUpdate(target);
         }
         if (target != null)
         {
             if (transaction == null)
             {
                 throw ADP.TransactionRequired(method);
             }
             OleDbTransaction transaction3 = OleDbTransaction.TransactionLast(target);
             if (transaction3 == transaction)
             {
                 return(transaction);
             }
             if (transaction3.Connection != transaction.Connection)
             {
                 throw ADP.TransactionConnectionMismatch();
             }
             throw ADP.TransactionCompleted();
         }
         this.weakTransaction = null;
     }
     else if ((transaction != null) && (transaction.Connection != null))
     {
         throw ADP.TransactionConnectionMismatch();
     }
     return(null);
 }
Exemplo n.º 2
0
        internal OleDbTransaction ValidateTransaction(OleDbTransaction transaction, string method)
        {
            if (null != this.weakTransaction)
            {
                OleDbTransaction head = (OleDbTransaction)this.weakTransaction.Target;
                if ((null != head) && this.weakTransaction.IsAlive)
                {
                    head = OleDbTransaction.TransactionUpdate(head);

                    // either we are wrong or finalize was called and object still alive
                    Debug.Assert(null != head, "unexcpted Transaction state");
                }
                // else transaction has finalized on user

                if (null != head)
                {
                    if (null == transaction)
                    {
                        // valid transaction exists and cmd doesn't have it
                        throw ADP.TransactionRequired(method);
                    }
                    else
                    {
                        OleDbTransaction tail = OleDbTransaction.TransactionLast(head);
                        if (tail != transaction)
                        {
                            if (tail.Connection != transaction.Connection)
                            {
                                throw ADP.TransactionConnectionMismatch();
                            }
                            // else cmd has incorrect transaction
                            throw ADP.TransactionCompleted();
                        }
                        // else cmd has correct transaction
                        return(transaction);
                    }
                }
                else   // cleanup for Finalized transaction
                {
                    this.weakTransaction = null;
                }
            }
            else if ((null != transaction) && (null != transaction.Connection))   // MDAC 72706
            {
                throw ADP.TransactionConnectionMismatch();
            }
            // else no transaction and cmd is correct

            // MDAC 61649
            // if transactionObject is from this connection but zombied
            // and no transactions currently exists - then ignore the bogus object
            return(null);
        }