Exemple #1
0
        /// <summary>
        /// Construct a new <see cref="AdoPersistenceResourceAccessor" /> with the
        /// specified <see cref="IAdoResourceProvider" />,
        /// <see cref="IPersistenceNameResolver" /> and <see cref="IAdoValueReader" />
        /// All work should be performed in the specified <see cref="Transaction" />.
        /// </summary>
        /// <param name="resourceProvider">
        /// An <see cref="IAdoResourceProvider" /> used to provide resources for
        /// accessing the tracking store.
        /// </param>
        /// <param name="nameResolver">
        /// An <see cref="IPersistenceNameResolver" /> that resolves names
        /// of commands and parameters for the relevant tracking store.
        /// </param>
        /// <param name="valueReader">
        /// An <see cref="IAdoValueReader" /> that reads values from
        /// <see cref="IDbCommand" /> and <see cref="IDataReader" /> implementations.
        /// </param>
        /// <param name="transaction">
        /// An <see cref="Transaction" /> in which to perform the work.
        /// </param>
        public AdoPersistenceResourceAccessor(IAdoResourceProvider resourceProvider,
                                              IPersistenceNameResolver nameResolver, IAdoValueReader valueReader,
                                              Transaction transaction)
        {
            if (resourceProvider == null)
            {
                throw new ArgumentNullException("resourceProvider");
            }

            if (nameResolver == null)
            {
                throw new ArgumentNullException("nameResolver");
            }

            if (valueReader == null)
            {
                throw new ArgumentNullException("valueReader");
            }

            _resourceProvider = resourceProvider;
            _nameResolver     = nameResolver;
            _valueReader      = valueReader;

            if (transaction == null)
            {
                _isConnectionOwner = true;
                _dbConnection      = resourceProvider.CreateConnection();
                _dbConnection.Open();
            }
            else
            {
                _dbConnection = resourceProvider.CreateEnlistedConnection(transaction, out _isConnectionOwner);
            }
        }
Exemple #2
0
        public AdoResourceAccessor(IAdoResourceProvider resourceProvider,
                                   IAdoNameResolver nameResolver, IAdoValueReader valueReader,
                                   Transaction transaction)
        {
            if (resourceProvider == null)
            {
                throw new ArgumentNullException("resourceProvider");
            }

            if (nameResolver == null)
            {
                throw new ArgumentNullException("nameResolver");
            }

            if (valueReader == null)
            {
                throw new ArgumentNullException("valueReader");
            }

            this.resourceProvider = resourceProvider;
            this.nameResolver     = nameResolver;
            this.valueReader      = valueReader;

            if (transaction == null)
            {
                this.dbConnection = resourceProvider.CreateConnection();
                this.dbConnection.Open();
            }
            else
            {
                this.dbConnection = resourceProvider.CreateEnlistedConnection(transaction);
            }
        }
Exemple #3
0
            /// <summary>
            /// Creates an ADO connection and enlists it in the specified transaction.
            /// </summary>
            /// <param name="transaction">
            /// The <see cref="Transaction" /> in which to enlist a new connection in.
            /// </param>
            /// <param name="shouldClose">
            /// Indicates whether the caller should close the connection or
            /// whether it is managed by an external entity.
            /// </param>
            /// <returns>
            /// A <see cref="DbConnection" /> that is enlisted in the specified
            /// <see cref="Transaction" />.
            /// </returns>
            public DbConnection CreateEnlistedConnection(Transaction transaction, out bool shouldClose)
            {
                if (transaction == null)
                {
                    throw new ArgumentNullException("transaction");
                }

                if (innerResourceProvider == null)
                {
                    throw new NotSupportedException(RM.Get_Error_ResourceProviderNotInitialised());
                }

                if (workBatchService.connectionsByTransaction.ContainsKey(transaction))
                {
                    DbConnection dbConnection;
                    Dictionary <String, DbConnection> connectionsByConnectionString = workBatchService.connectionsByTransaction[transaction];
                    if (!connectionsByConnectionString.TryGetValue(innerResourceProvider.ConnectionString, out dbConnection))
                    {
                        if (workBatchService.useLocalTransactions)
                        {
                            // we're using local transactions - create a new
                            // SinglePhaseOnlyTransactionAdapter to create a local
                            // transaction and prevent it from being promoted to
                            // a distributed transaction
                            try
                            {
                                dbConnection = innerResourceProvider.CreateConnection();
                                dbConnection.Open();

                                // can only do this once (additional enlistments will fail)
                                workBatchService.transactionAdapter = new SinglePhaseOnlyTransactionAdapter(dbConnection);
                                workBatchService.transactionAdapter.Begin();
                            }
                            catch
                            {
                                if (dbConnection != null)
                                {
                                    dbConnection.Dispose();
                                }

                                throw;
                            }
                        }
                        else
                        {
                            dbConnection = innerResourceProvider.CreateEnlistedConnection(transaction, out shouldClose);
                        }

                        connectionsByConnectionString.Add(innerResourceProvider.ConnectionString, dbConnection);
                    }

                    shouldClose = false;

                    return(dbConnection);
                }
                else
                {
                    throw new ArgumentNullException(RM.Get_Error_InvalidTransactionSpecified());
                }
            }
        /// <summary>
        /// Construct a new <see cref="AdoPersistenceResourceAccessor" /> with the
        /// specified <see cref="IAdoResourceProvider" />, 
        /// <see cref="IPersistenceNameResolver" /> and <see cref="IAdoValueReader" /> 
        /// All work should be performed in the specified <see cref="Transaction" />.
        /// </summary>
        /// <param name="resourceProvider">
        /// An <see cref="IAdoResourceProvider" /> used to provide resources for
        /// accessing the tracking store.
        /// </param>
        /// <param name="nameResolver">
        /// An <see cref="IPersistenceNameResolver" /> that resolves names
        /// of commands and parameters for the relevant tracking store.
        /// </param>
        /// <param name="valueReader">
        /// An <see cref="IAdoValueReader" /> that reads values from
        /// <see cref="IDbCommand" /> and <see cref="IDataReader" /> implementations.
        /// </param>
        /// <param name="transaction">
        /// An <see cref="Transaction" /> in which to perform the work.
        /// </param>
        public AdoPersistenceResourceAccessor(IAdoResourceProvider resourceProvider,
            IPersistenceNameResolver nameResolver, IAdoValueReader valueReader,
            Transaction transaction)
        {
            if (resourceProvider == null)
                throw new ArgumentNullException("resourceProvider");

            if (nameResolver == null)
                throw new ArgumentNullException("nameResolver");

            if (valueReader == null)
                throw new ArgumentNullException("valueReader");

            this.resourceProvider = resourceProvider;
            this.nameResolver = nameResolver;
            this.valueReader = valueReader;

            if (transaction == null)
            {
                this.isConnectionOwner = true;
                this.dbConnection = resourceProvider.CreateConnection();
                this.dbConnection.Open();
            }
            else
                this.dbConnection = resourceProvider.CreateEnlistedConnection(transaction, out this.isConnectionOwner);
        }