Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / SqlConnectionManager.cs / 1305376 / 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 bool disposeConnection; // should we dispose this connection when the context is disposed? private DbTransaction transaction; private Transaction systemTransaction; private SqlInfoMessageEventHandler infoMessagehandler; private Listusers; private int maxUsers; internal SqlConnectionManager(IProvider provider, DbConnection con, int maxUsers, bool disposeConnection) { this.provider = provider; this.connection = con; this.maxUsers = maxUsers; this.infoMessagehandler = new SqlInfoMessageEventHandler(this.OnInfoMessage); this.users = new List (maxUsers); this.disposeConnection = disposeConnection; } 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(); } // If we created the connection, we need to dispose it even if the user explicitly // opened it using the Connection property on the context. if (this.connection != null && this.disposeConnection) { this.connection.Dispose(); this.connection = null; } } 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 bool disposeConnection; // should we dispose this connection when the context is disposed? private DbTransaction transaction; private Transaction systemTransaction; private SqlInfoMessageEventHandler infoMessagehandler; private List users; private int maxUsers; internal SqlConnectionManager(IProvider provider, DbConnection con, int maxUsers, bool disposeConnection) { this.provider = provider; this.connection = con; this.maxUsers = maxUsers; this.infoMessagehandler = new SqlInfoMessageEventHandler(this.OnInfoMessage); this.users = new List (maxUsers); this.disposeConnection = disposeConnection; } 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(); } // If we created the connection, we need to dispose it even if the user explicitly // opened it using the Connection property on the context. if (this.connection != null && this.disposeConnection) { this.connection.Dispose(); this.connection = null; } } 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
- ControlType.cs
- Byte.cs
- SmiEventSink_DeferedProcessing.cs
- TextElementAutomationPeer.cs
- diagnosticsswitches.cs
- RubberbandSelector.cs
- VirtualDirectoryMappingCollection.cs
- CharStorage.cs
- TreeNodeCollection.cs
- XmlValueConverter.cs
- XmlSchemaImporter.cs
- CharacterBufferReference.cs
- RightNameExpirationInfoPair.cs
- StringComparer.cs
- HtmlEmptyTagControlBuilder.cs
- Set.cs
- Size3DConverter.cs
- Size.cs
- OpCodes.cs
- GroupItemAutomationPeer.cs
- TemplatedControlDesigner.cs
- XmlAttributeCollection.cs
- ResXDataNode.cs
- WebPartVerb.cs
- XmlSignificantWhitespace.cs
- ObservableCollection.cs
- SqlCacheDependency.cs
- MemoryStream.cs
- EntityDesignerDataSourceView.cs
- OdbcParameter.cs
- HtmlElementErrorEventArgs.cs
- BinaryConverter.cs
- AssemblyBuilder.cs
- XmlUtil.cs
- FileDataSourceCache.cs
- SiteMapNodeItem.cs
- VirtualizedItemPattern.cs
- ComponentEvent.cs
- ViewBase.cs
- HashMembershipCondition.cs
- RequiredFieldValidator.cs
- IsolatedStorageFilePermission.cs
- SafeNativeMethods.cs
- TextLine.cs
- MethodMessage.cs
- StreamingContext.cs
- X509CertificateCollection.cs
- Material.cs
- SplayTreeNode.cs
- IOException.cs
- DataObjectAttribute.cs
- RepeaterItemCollection.cs
- SamlDoNotCacheCondition.cs
- WhiteSpaceTrimStringConverter.cs
- SortKey.cs
- CollectionViewGroupRoot.cs
- DiscoveryClientElement.cs
- NodeFunctions.cs
- JapaneseLunisolarCalendar.cs
- AccessKeyManager.cs
- Soap.cs
- FontSizeConverter.cs
- EncoderReplacementFallback.cs
- StringStorage.cs
- DocumentViewer.cs
- TextRenderingModeValidation.cs
- FontUnit.cs
- ListSortDescription.cs
- Int16KeyFrameCollection.cs
- GridViewUpdateEventArgs.cs
- SHA256Managed.cs
- TemplateField.cs
- MetadataUtilsSmi.cs
- FormViewPagerRow.cs
- ToolStripItem.cs
- BindingCompleteEventArgs.cs
- GuidelineSet.cs
- Random.cs
- MethodMessage.cs
- WeakHashtable.cs
- WindowsListBox.cs
- xml.cs
- Calendar.cs
- RectangleConverter.cs
- NameSpaceExtractor.cs
- UIElement.cs
- MethodAccessException.cs
- WebPartAddingEventArgs.cs
- GPStream.cs
- externdll.cs
- ChangePasswordAutoFormat.cs
- MediaEntryAttribute.cs
- XmlConvert.cs
- EFTableProvider.cs
- ToolStripItemClickedEventArgs.cs
- XPathItem.cs
- handlecollector.cs
- ScaleTransform3D.cs
- DataBoundLiteralControl.cs
- SynchronizedDispatch.cs