Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SqlClient / SqlConnectionManager.cs / 1 / SqlConnectionManager.cs
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq.Expressions; using System.IO; using System.Reflection; using System.Text; using System.Transactions; namespace System.Data.Linq.SqlClient { using System.Data.Linq; using System.Data.Linq.Provider; internal class SqlConnectionManager : IConnectionManager { private IProvider provider; private DbConnection connection; private bool autoClose; private DbTransaction transaction; private Transaction systemTransaction; private SqlInfoMessageEventHandler infoMessagehandler; private Listusers; private int maxUsers; internal SqlConnectionManager(IProvider provider, DbConnection con, int maxUsers) { this.provider = provider; this.connection = con; this.maxUsers = maxUsers; this.infoMessagehandler = new SqlInfoMessageEventHandler(this.OnInfoMessage); this.users = new List (maxUsers); } public DbConnection UseConnection(IConnectionUser user) { if (user == null) { throw Error.ArgumentNull("user"); } if (this.connection.State == ConnectionState.Closed) { this.connection.Open(); this.autoClose = true; this.AddInfoMessageHandler(); if (System.Transactions.Transaction.Current != null) { System.Transactions.Transaction.Current.TransactionCompleted += this.OnTransactionCompleted; } } if (this.transaction == null && System.Transactions.Transaction.Current != null && System.Transactions.Transaction.Current != systemTransaction) { this.ClearConnection(); systemTransaction = System.Transactions.Transaction.Current; this.connection.EnlistTransaction(System.Transactions.Transaction.Current); } if (this.users.Count == this.maxUsers) { this.BootUser(this.users[0]); } this.users.Add(user); return this.connection; } private void BootUser(IConnectionUser user) { bool saveAutoClose = this.autoClose; this.autoClose = false; int index = this.users.IndexOf(user); if (index >= 0) { this.users.RemoveAt(index); } user.CompleteUse(); this.autoClose = saveAutoClose; } internal DbConnection Connection { get { return this.connection; } } internal int MaxUsers { get { return this.maxUsers; } } internal void DisposeConnection() { // only close this guy if we opened it in the first place if (this.autoClose) { this.CloseConnection(); } } internal void ClearConnection() { while (this.users.Count > 0) { this.BootUser(this.users[0]); } } internal bool AutoClose { get { return this.autoClose; } set { this.autoClose = value; } } internal DbTransaction Transaction { get { return this.transaction; } set { if (value != this.transaction) { if (value != null) { if (this.connection != value.Connection) { throw Error.TransactionDoesNotMatchConnection(); } } this.transaction = value; } } } public void ReleaseConnection(IConnectionUser user) { if (user == null) { throw Error.ArgumentNull("user"); } int index = this.users.IndexOf(user); if (index >= 0) { this.users.RemoveAt(index); } if (this.users.Count == 0 && this.autoClose && this.transaction == null && System.Transactions.Transaction.Current == null) { this.CloseConnection(); } } private void CloseConnection() { if (this.connection != null && this.connection.State != ConnectionState.Closed) { this.connection.Close(); } this.RemoveInfoMessageHandler(); this.autoClose = false; } private void OnInfoMessage(object sender, SqlInfoMessageEventArgs args) { if (this.provider.Log != null) { this.provider.Log.WriteLine(Strings.LogGeneralInfoMessage(args.Source, args.Message)); } } private void OnTransactionCompleted(object sender, System.Transactions.TransactionEventArgs args) { if (this.users.Count == 0 && this.autoClose) { this.CloseConnection(); } } private void AddInfoMessageHandler() { SqlConnection scon = this.connection as SqlConnection; if (scon != null) { scon.InfoMessage += this.infoMessagehandler; } } private void RemoveInfoMessageHandler() { SqlConnection scon = this.connection as SqlConnection; if (scon != null) { scon.InfoMessage -= this.infoMessagehandler; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq.Expressions; using System.IO; using System.Reflection; using System.Text; using System.Transactions; namespace System.Data.Linq.SqlClient { using System.Data.Linq; using System.Data.Linq.Provider; internal class SqlConnectionManager : IConnectionManager { private IProvider provider; private DbConnection connection; private bool autoClose; private DbTransaction transaction; private Transaction systemTransaction; private SqlInfoMessageEventHandler infoMessagehandler; private List users; private int maxUsers; internal SqlConnectionManager(IProvider provider, DbConnection con, int maxUsers) { this.provider = provider; this.connection = con; this.maxUsers = maxUsers; this.infoMessagehandler = new SqlInfoMessageEventHandler(this.OnInfoMessage); this.users = new List (maxUsers); } public DbConnection UseConnection(IConnectionUser user) { if (user == null) { throw Error.ArgumentNull("user"); } if (this.connection.State == ConnectionState.Closed) { this.connection.Open(); this.autoClose = true; this.AddInfoMessageHandler(); if (System.Transactions.Transaction.Current != null) { System.Transactions.Transaction.Current.TransactionCompleted += this.OnTransactionCompleted; } } if (this.transaction == null && System.Transactions.Transaction.Current != null && System.Transactions.Transaction.Current != systemTransaction) { this.ClearConnection(); systemTransaction = System.Transactions.Transaction.Current; this.connection.EnlistTransaction(System.Transactions.Transaction.Current); } if (this.users.Count == this.maxUsers) { this.BootUser(this.users[0]); } this.users.Add(user); return this.connection; } private void BootUser(IConnectionUser user) { bool saveAutoClose = this.autoClose; this.autoClose = false; int index = this.users.IndexOf(user); if (index >= 0) { this.users.RemoveAt(index); } user.CompleteUse(); this.autoClose = saveAutoClose; } internal DbConnection Connection { get { return this.connection; } } internal int MaxUsers { get { return this.maxUsers; } } internal void DisposeConnection() { // only close this guy if we opened it in the first place if (this.autoClose) { this.CloseConnection(); } } internal void ClearConnection() { while (this.users.Count > 0) { this.BootUser(this.users[0]); } } internal bool AutoClose { get { return this.autoClose; } set { this.autoClose = value; } } internal DbTransaction Transaction { get { return this.transaction; } set { if (value != this.transaction) { if (value != null) { if (this.connection != value.Connection) { throw Error.TransactionDoesNotMatchConnection(); } } this.transaction = value; } } } public void ReleaseConnection(IConnectionUser user) { if (user == null) { throw Error.ArgumentNull("user"); } int index = this.users.IndexOf(user); if (index >= 0) { this.users.RemoveAt(index); } if (this.users.Count == 0 && this.autoClose && this.transaction == null && System.Transactions.Transaction.Current == null) { this.CloseConnection(); } } private void CloseConnection() { if (this.connection != null && this.connection.State != ConnectionState.Closed) { this.connection.Close(); } this.RemoveInfoMessageHandler(); this.autoClose = false; } private void OnInfoMessage(object sender, SqlInfoMessageEventArgs args) { if (this.provider.Log != null) { this.provider.Log.WriteLine(Strings.LogGeneralInfoMessage(args.Source, args.Message)); } } private void OnTransactionCompleted(object sender, System.Transactions.TransactionEventArgs args) { if (this.users.Count == 0 && this.autoClose) { this.CloseConnection(); } } private void AddInfoMessageHandler() { SqlConnection scon = this.connection as SqlConnection; if (scon != null) { scon.InfoMessage += this.infoMessagehandler; } } private void RemoveInfoMessageHandler() { SqlConnection scon = this.connection as SqlConnection; if (scon != null) { scon.InfoMessage -= this.infoMessagehandler; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GlyphsSerializer.cs
- TargetParameterCountException.cs
- AsynchronousChannel.cs
- X500Name.cs
- figurelength.cs
- OrderedDictionaryStateHelper.cs
- XamlClipboardData.cs
- MailAddressCollection.cs
- TypedTableBaseExtensions.cs
- COM2TypeInfoProcessor.cs
- ZipIORawDataFileBlock.cs
- DataContract.cs
- DetailsViewAutoFormat.cs
- EntityKeyElement.cs
- Activator.cs
- TracePayload.cs
- ListenerHandler.cs
- BamlTreeNode.cs
- LicenseManager.cs
- RootBrowserWindowAutomationPeer.cs
- IsolatedStoragePermission.cs
- TreeIterators.cs
- DataMemberFieldEditor.cs
- PropertyInfoSet.cs
- XmlAtomicValue.cs
- Rect3DValueSerializer.cs
- PackageFilter.cs
- PropertyBuilder.cs
- SplitterCancelEvent.cs
- ReceiveMessageAndVerifySecurityAsyncResultBase.cs
- CodeNamespaceCollection.cs
- DecimalAnimationUsingKeyFrames.cs
- AlignmentYValidation.cs
- XmlElementAttribute.cs
- UserUseLicenseDictionaryLoader.cs
- CopyAttributesAction.cs
- ObjectParameterCollection.cs
- FormViewDeletedEventArgs.cs
- VectorValueSerializer.cs
- QilReference.cs
- QuaternionConverter.cs
- OuterGlowBitmapEffect.cs
- COM2Properties.cs
- StylusPlugInCollection.cs
- Module.cs
- DefaultParameterValueAttribute.cs
- TraceData.cs
- Literal.cs
- TextOnlyOutput.cs
- ObjectTypeMapping.cs
- ComponentEditorPage.cs
- XmlCDATASection.cs
- CommandDevice.cs
- DynamicMetaObjectBinder.cs
- Int64.cs
- ConnectionInterfaceCollection.cs
- DbProviderServices.cs
- UInt16.cs
- BindableTemplateBuilder.cs
- SqlResolver.cs
- InertiaExpansionBehavior.cs
- ReadOnlyHierarchicalDataSourceView.cs
- IdleTimeoutMonitor.cs
- BuildManager.cs
- MessageDescriptionCollection.cs
- DesignerResources.cs
- PreProcessor.cs
- TextTrailingWordEllipsis.cs
- BaseTemplateBuildProvider.cs
- EventHandlerList.cs
- ChannelSinkStacks.cs
- SymLanguageVendor.cs
- LeaseManager.cs
- DeviceContext2.cs
- DefaultAssemblyResolver.cs
- RelatedView.cs
- CompressionTransform.cs
- ExpressionLexer.cs
- DoubleAnimationUsingKeyFrames.cs
- HttpHandler.cs
- TextLine.cs
- XmlChoiceIdentifierAttribute.cs
- UInt64Storage.cs
- EnumMember.cs
- AnimationClockResource.cs
- Win32.cs
- SynchronizationLockException.cs
- ManifestResourceInfo.cs
- ModelItem.cs
- ResizeGrip.cs
- OracleBFile.cs
- _HeaderInfoTable.cs
- ListViewPagedDataSource.cs
- RowType.cs
- UnionCqlBlock.cs
- SafeWaitHandle.cs
- HwndHostAutomationPeer.cs
- TreeViewAutomationPeer.cs
- StoreItemCollection.Loader.cs
- MetaModel.cs