1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.ComponentModel; 6 using System.Threading; 7 using System.Threading.Tasks; 8 9 namespace System.Data.Common 10 { 11 public abstract partial class DbConnection : Component, IDbConnection 12 { 13 #pragma warning disable 649 // ignore unassigned field warning 14 internal bool _suppressStateChangeForReconnection; 15 #pragma warning restore 649 16 DbConnection()17 protected DbConnection() : base() 18 { 19 } 20 21 [DefaultValue("")] 22 [SettingsBindableAttribute(true)] 23 [RefreshProperties(RefreshProperties.All)] 24 #pragma warning disable 618 // ignore obsolete warning about RecommendedAsConfigurable to use SettingsBindableAttribute 25 [RecommendedAsConfigurable(true)] 26 #pragma warning restore 618 27 public abstract string ConnectionString { get; set; } 28 29 public virtual int ConnectionTimeout => ADP.DefaultConnectionTimeout; 30 31 public abstract string Database { get; } 32 33 public abstract string DataSource { get; } 34 35 /// <summary> 36 /// The associated provider factory for derived class. 37 /// </summary> 38 protected virtual DbProviderFactory DbProviderFactory => null; 39 40 internal DbProviderFactory ProviderFactory => DbProviderFactory; 41 42 [Browsable(false)] 43 public abstract string ServerVersion { get; } 44 45 [Browsable(false)] 46 public abstract ConnectionState State { get; } 47 48 public virtual event StateChangeEventHandler StateChange; 49 BeginDbTransaction(IsolationLevel isolationLevel)50 protected abstract DbTransaction BeginDbTransaction(IsolationLevel isolationLevel); 51 BeginTransaction()52 public DbTransaction BeginTransaction() => 53 BeginDbTransaction(IsolationLevel.Unspecified); 54 BeginTransaction(IsolationLevel isolationLevel)55 public DbTransaction BeginTransaction(IsolationLevel isolationLevel) 56 { 57 return BeginDbTransaction(isolationLevel); 58 } 59 IDbConnection.BeginTransaction()60 IDbTransaction IDbConnection.BeginTransaction() => 61 BeginDbTransaction(IsolationLevel.Unspecified); 62 63 IDbTransaction IDbConnection.BeginTransaction(IsolationLevel isolationLevel) => 64 BeginDbTransaction(isolationLevel); 65 Close()66 public abstract void Close(); 67 ChangeDatabase(string databaseName)68 public abstract void ChangeDatabase(string databaseName); 69 CreateCommand()70 public DbCommand CreateCommand() => CreateDbCommand(); 71 IDbConnection.CreateCommand()72 IDbCommand IDbConnection.CreateCommand() => CreateDbCommand(); 73 CreateDbCommand()74 protected abstract DbCommand CreateDbCommand(); 75 EnlistTransaction(System.Transactions.Transaction transaction)76 public virtual void EnlistTransaction(System.Transactions.Transaction transaction) 77 { 78 throw ADP.NotSupported(); 79 } 80 81 // these need to be here so that GetSchema is visible when programming to a dbConnection object. 82 // they are overridden by the real implementations in DbConnectionBase GetSchema()83 public virtual DataTable GetSchema() 84 { 85 throw ADP.NotSupported(); 86 } 87 GetSchema(string collectionName)88 public virtual DataTable GetSchema(string collectionName) 89 { 90 throw ADP.NotSupported(); 91 } 92 GetSchema(string collectionName, string[] restrictionValues)93 public virtual DataTable GetSchema(string collectionName, string[] restrictionValues) 94 { 95 throw ADP.NotSupported(); 96 } 97 OnStateChange(StateChangeEventArgs stateChange)98 protected virtual void OnStateChange(StateChangeEventArgs stateChange) 99 { 100 if (_suppressStateChangeForReconnection) 101 { 102 return; 103 } 104 105 StateChange?.Invoke(this, stateChange); 106 } 107 Open()108 public abstract void Open(); 109 OpenAsync()110 public Task OpenAsync() => OpenAsync(CancellationToken.None); 111 OpenAsync(CancellationToken cancellationToken)112 public virtual Task OpenAsync(CancellationToken cancellationToken) 113 { 114 if (cancellationToken.IsCancellationRequested) 115 { 116 return Task.FromCanceled(cancellationToken); 117 } 118 else 119 { 120 try 121 { 122 Open(); 123 return Task.CompletedTask; 124 } 125 catch (Exception e) 126 { 127 return Task.FromException(e); 128 } 129 } 130 } 131 } 132 } 133