[runtime] Overwrite stacktrace for exception on re-throw. Fixes #1856.
[mono.git] / mcs / class / System.Data / System.Data.Common / DbCommand.cs
1 //
2 // System.Data.Common.DbCommand
3 //
4 // Author:
5 //   Tim Coleman (tim@timcoleman.com)
6 //
7 // Copyright (C) Tim Coleman, 2003
8 //
9
10 //
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 using System.ComponentModel;
34 using System.Data;
35
36 using System.Threading;
37 using System.Threading.Tasks;
38
39 namespace System.Data.Common {
40         public abstract class DbCommand : Component, IDbCommand, IDisposable
41         {
42                 protected DbCommand ()
43                 {
44                 }
45
46                 #region Properties
47
48                 [DefaultValue ("")]
49                 [RefreshProperties (RefreshProperties.All)]
50                 public abstract string CommandText { get; set; }
51
52                 public abstract int CommandTimeout { get; set; }
53
54                 [DefaultValue (CommandType.Text)]
55                 [RefreshProperties (RefreshProperties.All)]
56                 public abstract CommandType CommandType { get; set; }
57
58                 [DefaultValue (null)]
59                 [Browsable (false)]
60                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
61                 public DbConnection Connection {
62                         get { return DbConnection; }
63                         set { DbConnection = value; }
64                 }
65
66                 protected abstract DbConnection DbConnection { get; set; }
67                 protected abstract DbParameterCollection DbParameterCollection { get; }
68                 protected abstract DbTransaction DbTransaction { get; set; }
69
70                 [EditorBrowsable (EditorBrowsableState.Never)]
71                 [Browsable (false)]
72                 [DefaultValue (true)]
73                 [DesignOnly (true)]
74                 public abstract bool DesignTimeVisible { get; set; }
75
76                 IDbConnection IDbCommand.Connection {
77                         get { return Connection; }
78                         set { Connection = (DbConnection) value; }
79                 }
80
81                 IDataParameterCollection IDbCommand.Parameters {
82                         get { return Parameters; }
83                 }
84
85                 IDbTransaction IDbCommand.Transaction {
86                         get { return Transaction; }
87                         set { Transaction = (DbTransaction) value; }
88                 }
89
90                 [Browsable (false)]
91                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
92                 public DbParameterCollection Parameters {
93                         get { return DbParameterCollection; }
94                 }
95
96                 [Browsable (false)]
97                 [DefaultValue (null)]
98                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
99                 public DbTransaction Transaction {
100                         get { return DbTransaction; }
101                         set { DbTransaction = value; }
102                 }
103
104                 [DefaultValue (UpdateRowSource.Both)]
105                 public abstract UpdateRowSource UpdatedRowSource { get; set; }
106
107                 #endregion // Properties
108
109                 #region Methods
110
111                 public abstract void Cancel ();
112                 protected abstract DbParameter CreateDbParameter ();
113
114                 public DbParameter CreateParameter ()
115                 {
116                         return CreateDbParameter ();
117                 }
118
119                 protected abstract DbDataReader ExecuteDbDataReader (CommandBehavior behavior);
120                 public abstract int ExecuteNonQuery ();
121                 
122                 public DbDataReader ExecuteReader ()
123                 {
124                         return ExecuteDbDataReader (CommandBehavior.Default);
125                 }
126
127                 public DbDataReader ExecuteReader (CommandBehavior behavior)
128                 {
129                         return ExecuteDbDataReader (behavior);
130                 }
131
132                 public abstract object ExecuteScalar ();
133
134                 IDbDataParameter IDbCommand.CreateParameter ()
135                 {
136                         return CreateParameter ();
137                 }
138
139                 IDataReader IDbCommand.ExecuteReader ()
140                 {
141                         return ExecuteReader ();
142                 }
143
144                 IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)
145                 {
146                         return ExecuteReader (behavior);
147                 }
148
149                 public abstract void Prepare ();
150                 
151                 protected virtual Task<DbDataReader> ExecuteDbDataReaderAsync (CommandBehavior behavior, CancellationToken cancellationToken)
152                 {
153                         if (cancellationToken.IsCancellationRequested) {
154                                 return TaskHelper.CreateCanceledTask<DbDataReader> ();
155                         }
156                         
157                         try {
158                                 return Task.FromResult (ExecuteDbDataReader (behavior));
159                         } catch (Exception e) {
160                                 return TaskHelper.CreateExceptionTask<DbDataReader> (e);
161                         }
162                 }
163                 
164                 public Task<int> ExecuteNonQueryAsync ()
165                 {
166                         return ExecuteNonQueryAsync (CancellationToken.None);
167                 }
168                 
169                 public virtual Task<int> ExecuteNonQueryAsync (CancellationToken cancellationToken)
170                 {
171                         if (cancellationToken.IsCancellationRequested) {
172                                 return TaskHelper.CreateCanceledTask<int> ();
173                         }
174                         
175                         try {
176                                 return Task.FromResult (ExecuteNonQuery ());
177                         } catch (Exception e) {
178                                 return TaskHelper.CreateExceptionTask<int> (e);
179                         }
180                 }
181                 
182                 public Task<Object> ExecuteScalarAsync ()
183                 {
184                         return ExecuteScalarAsync (CancellationToken.None);
185                 }
186                 
187                 public virtual Task<Object> ExecuteScalarAsync (CancellationToken cancellationToken)
188                 {
189                         if (cancellationToken.IsCancellationRequested) {
190                                 return TaskHelper.CreateCanceledTask<Object> ();
191                         }
192                         
193                         try {
194                                 return Task.FromResult (ExecuteScalar ());
195                         } catch (Exception e) {
196                                 return TaskHelper.CreateExceptionTask<Object> (e);
197                         }
198                 }
199                 
200                 public Task<DbDataReader> ExecuteReaderAsync ()
201                 {
202                         return ExecuteReaderAsync (CancellationToken.None);
203                 }
204                 
205                 public Task<DbDataReader> ExecuteReaderAsync (CancellationToken cancellationToken)
206                 {
207                         if (cancellationToken.IsCancellationRequested) {
208                                 return TaskHelper.CreateCanceledTask<DbDataReader> ();
209                         }
210                         
211                         try {
212                                 return Task.FromResult (ExecuteReader ());
213                         } catch (Exception e) {
214                                 return TaskHelper.CreateExceptionTask<DbDataReader> (e);
215                         }
216                 }
217                 
218                 public Task<DbDataReader> ExecuteReaderAsync (CommandBehavior behavior)
219                 {
220                         return ExecuteReaderAsync (behavior, CancellationToken.None);
221                 }
222                 
223                 public Task<DbDataReader> ExecuteReaderAsync (CommandBehavior behavior, CancellationToken cancellationToken)
224                 {
225                         if (cancellationToken.IsCancellationRequested) {
226                                 return TaskHelper.CreateCanceledTask<DbDataReader> ();
227                         }
228                         
229                         try {
230                                 return Task.FromResult (ExecuteReader (behavior));
231                         } catch (Exception e) {
232                                 return TaskHelper.CreateExceptionTask<DbDataReader> (e);
233                         }
234                 }
235
236                 
237                 #endregion // Methods
238
239         }
240 }