Skip to content

Commit df448b0

Browse files
committed
Add async methods in System.Data.Common, implement IAsyncDisposable
Closes #35012
1 parent 39315f8 commit df448b0

File tree

5 files changed

+171
-0
lines changed

5 files changed

+171
-0
lines changed

src/System.Data.Common/ref/System.Data.Common.cs

+13
Original file line numberDiff line numberDiff line change
@@ -1848,9 +1848,11 @@ protected DbCommand() { }
18481848
public System.Threading.Tasks.Task<object> ExecuteScalarAsync() { throw null; }
18491849
public virtual System.Threading.Tasks.Task<object> ExecuteScalarAsync(System.Threading.CancellationToken cancellationToken) { throw null; }
18501850
public abstract void Prepare();
1851+
public virtual System.Threading.Tasks.Task PrepareAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
18511852
System.Data.IDbDataParameter System.Data.IDbCommand.CreateParameter() { throw null; }
18521853
System.Data.IDataReader System.Data.IDbCommand.ExecuteReader() { throw null; }
18531854
System.Data.IDataReader System.Data.IDbCommand.ExecuteReader(System.Data.CommandBehavior behavior) { throw null; }
1855+
public virtual System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
18541856
}
18551857
public abstract partial class DbCommandBuilder : System.ComponentModel.Component
18561858
{
@@ -1912,7 +1914,9 @@ public virtual event System.Data.StateChangeEventHandler StateChange { add { } r
19121914
public System.Data.Common.DbTransaction BeginTransaction() { throw null; }
19131915
public System.Data.Common.DbTransaction BeginTransaction(System.Data.IsolationLevel isolationLevel) { throw null; }
19141916
public abstract void ChangeDatabase(string databaseName);
1917+
public virtual System.Threading.Tasks.Task ChangeDatabaseAsync(string databaseName, System.Threading.CancellationToken cancellationToken = default) { throw null; }
19151918
public abstract void Close();
1919+
public virtual System.Threading.Tasks.Task CloseAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
19161920
public System.Data.Common.DbCommand CreateCommand() { throw null; }
19171921
protected abstract System.Data.Common.DbCommand CreateDbCommand();
19181922
public virtual void EnlistTransaction(System.Transactions.Transaction transaction) { }
@@ -1925,7 +1929,11 @@ protected virtual void OnStateChange(System.Data.StateChangeEventArgs stateChang
19251929
public virtual System.Threading.Tasks.Task OpenAsync(System.Threading.CancellationToken cancellationToken) { throw null; }
19261930
System.Data.IDbTransaction System.Data.IDbConnection.BeginTransaction() { throw null; }
19271931
System.Data.IDbTransaction System.Data.IDbConnection.BeginTransaction(System.Data.IsolationLevel isolationLevel) { throw null; }
1932+
protected virtual System.Threading.Tasks.ValueTask<DbTransaction> BeginDbTransactionAsync(IsolationLevel isolationLevel, System.Threading.CancellationToken cancellationToken) { throw null; }
1933+
public System.Threading.Tasks.ValueTask<DbTransaction> BeginTransactionAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
1934+
public System.Threading.Tasks.ValueTask<DbTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, System.Threading.CancellationToken cancellationToken = default) { throw null; }
19281935
System.Data.IDbCommand System.Data.IDbConnection.CreateCommand() { throw null; }
1936+
public virtual System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
19291937
}
19301938
public partial class DbConnectionStringBuilder : System.Collections.ICollection, System.Collections.IDictionary, System.Collections.IEnumerable, System.ComponentModel.ICustomTypeDescriptor
19311939
{
@@ -2054,8 +2062,10 @@ protected DbDataReader() { }
20542062
public abstract int RecordsAffected { get; }
20552063
public virtual int VisibleFieldCount { get { throw null; } }
20562064
public virtual void Close() { }
2065+
public virtual System.Threading.Tasks.Task CloseAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
20572066
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
20582067
public void Dispose() { }
2068+
public virtual System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
20592069
protected virtual void Dispose(bool disposing) { }
20602070
public abstract bool GetBoolean(int ordinal);
20612071
public abstract byte GetByte(int ordinal);
@@ -2349,9 +2359,12 @@ protected DbTransaction() { }
23492359
public abstract System.Data.IsolationLevel IsolationLevel { get; }
23502360
System.Data.IDbConnection System.Data.IDbTransaction.Connection { get { throw null; } }
23512361
public abstract void Commit();
2362+
public virtual System.Threading.Tasks.Task CommitAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
23522363
public void Dispose() { }
2364+
public virtual System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
23532365
protected virtual void Dispose(bool disposing) { }
23542366
public abstract void Rollback();
2367+
public virtual System.Threading.Tasks.Task RollbackAsync(System.Threading.CancellationToken cancellationToken = default) { throw null; }
23552368
}
23562369
public enum GroupByBehavior
23572370
{

src/System.Data.Common/src/System/Data/Common/DbCommand.cs

+24
Original file line numberDiff line numberDiff line change
@@ -222,5 +222,29 @@ public virtual Task<object> ExecuteScalarAsync(CancellationToken cancellationTok
222222
public abstract object ExecuteScalar();
223223

224224
public abstract void Prepare();
225+
226+
public virtual Task PrepareAsync(CancellationToken cancellationToken = default)
227+
{
228+
if (cancellationToken.IsCancellationRequested)
229+
{
230+
return Task.FromCanceled(cancellationToken);
231+
}
232+
233+
try
234+
{
235+
Prepare();
236+
return Task.CompletedTask;
237+
}
238+
catch (Exception e)
239+
{
240+
return Task.FromException(e);
241+
}
242+
}
243+
244+
public virtual ValueTask DisposeAsync()
245+
{
246+
Dispose();
247+
return default;
248+
}
225249
}
226250
}

src/System.Data.Common/src/System/Data/Common/DbConnection.cs

+65
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,75 @@ IDbTransaction IDbConnection.BeginTransaction() =>
6363
IDbTransaction IDbConnection.BeginTransaction(IsolationLevel isolationLevel) =>
6464
BeginDbTransaction(isolationLevel);
6565

66+
protected virtual ValueTask<DbTransaction> BeginDbTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken)
67+
{
68+
if (cancellationToken.IsCancellationRequested)
69+
{
70+
return new ValueTask<DbTransaction>(Task.FromCanceled<DbTransaction>(cancellationToken));
71+
}
72+
73+
try
74+
{
75+
return new ValueTask<DbTransaction>(BeginDbTransaction(isolationLevel));
76+
}
77+
catch (Exception e)
78+
{
79+
return new ValueTask<DbTransaction>(Task.FromException<DbTransaction>(e));
80+
}
81+
}
82+
83+
public ValueTask<DbTransaction> BeginTransactionAsync(CancellationToken cancellationToken = default)
84+
=> BeginDbTransactionAsync(IsolationLevel.Unspecified, cancellationToken);
85+
86+
public ValueTask<DbTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default)
87+
=> BeginDbTransactionAsync(isolationLevel, cancellationToken);
88+
6689
public abstract void Close();
6790

91+
public virtual Task CloseAsync(CancellationToken cancellationToken = default)
92+
{
93+
if (cancellationToken.IsCancellationRequested)
94+
{
95+
return Task.FromCanceled(cancellationToken);
96+
}
97+
98+
try
99+
{
100+
Close();
101+
return Task.CompletedTask;
102+
}
103+
catch (Exception e)
104+
{
105+
return Task.FromException(e);
106+
}
107+
}
108+
109+
public virtual ValueTask DisposeAsync()
110+
{
111+
Dispose();
112+
return default;
113+
}
114+
68115
public abstract void ChangeDatabase(string databaseName);
69116

117+
public virtual Task ChangeDatabaseAsync(string databaseName, CancellationToken cancellationToken = default)
118+
{
119+
if (cancellationToken.IsCancellationRequested)
120+
{
121+
return Task.FromCanceled(cancellationToken);
122+
}
123+
124+
try
125+
{
126+
ChangeDatabase(databaseName);
127+
return Task.CompletedTask;
128+
}
129+
catch (Exception e)
130+
{
131+
return Task.FromException(e);
132+
}
133+
}
134+
70135
public DbCommand CreateCommand() => CreateDbCommand();
71136

72137
IDbCommand IDbConnection.CreateCommand() => CreateDbCommand();

src/System.Data.Common/src/System/Data/Common/DbDataReader.cs

+24
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ protected DbDataReader() : base() { }
3232

3333
public virtual void Close() { }
3434

35+
public virtual Task CloseAsync(CancellationToken cancellationToken = default)
36+
{
37+
if (cancellationToken.IsCancellationRequested)
38+
{
39+
return Task.FromCanceled(cancellationToken);
40+
}
41+
42+
try
43+
{
44+
Close();
45+
return Task.CompletedTask;
46+
}
47+
catch (Exception e)
48+
{
49+
return Task.FromException(e);
50+
}
51+
}
52+
3553
[EditorBrowsable(EditorBrowsableState.Never)]
3654
public void Dispose() => Dispose(true);
3755

@@ -43,6 +61,12 @@ protected virtual void Dispose(bool disposing)
4361
}
4462
}
4563

64+
public virtual ValueTask DisposeAsync()
65+
{
66+
Dispose();
67+
return default;
68+
}
69+
4670
public abstract string GetDataTypeName(int ordinal);
4771

4872
[EditorBrowsable(EditorBrowsableState.Never)]

src/System.Data.Common/src/System/Data/Common/DbTransaction.cs

+45
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
58
namespace System.Data.Common
69
{
710
public abstract class DbTransaction : MarshalByRefObject, IDbTransaction
@@ -18,10 +21,52 @@ protected DbTransaction() : base() { }
1821

1922
public abstract void Commit();
2023

24+
public virtual Task CommitAsync(CancellationToken cancellationToken = default)
25+
{
26+
if (cancellationToken.IsCancellationRequested)
27+
{
28+
return Task.FromCanceled(cancellationToken);
29+
}
30+
31+
try
32+
{
33+
Commit();
34+
return Task.CompletedTask;
35+
}
36+
catch (Exception e)
37+
{
38+
return Task.FromException(e);
39+
}
40+
}
41+
2142
public void Dispose() => Dispose(true);
2243

2344
protected virtual void Dispose(bool disposing) { }
2445

46+
public virtual ValueTask DisposeAsync()
47+
{
48+
Dispose();
49+
return default;
50+
}
51+
2552
public abstract void Rollback();
53+
54+
public virtual Task RollbackAsync(CancellationToken cancellationToken = default)
55+
{
56+
if (cancellationToken.IsCancellationRequested)
57+
{
58+
return Task.FromCanceled(cancellationToken);
59+
}
60+
61+
try
62+
{
63+
Rollback();
64+
return Task.CompletedTask;
65+
}
66+
catch (Exception e)
67+
{
68+
return Task.FromException(e);
69+
}
70+
}
2671
}
2772
}

0 commit comments

Comments
 (0)