/// <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); } }
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); } }
/// <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); }