1 //------------------------------------------------------------------------------
2 // <copyright file="DbDataReader.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace System.Data.Common {
12 using System.Collections;
13 using System.ComponentModel;
16 using System.Threading.Tasks;
17 using System.Threading;
19 public abstract class DbDataReader : MarshalByRefObject, IDataReader, IEnumerable { // V1.2.3300
20 protected DbDataReader() : base() {
23 abstract public int Depth {
27 abstract public int FieldCount {
31 abstract public bool HasRows {
35 abstract public bool IsClosed {
39 abstract public int RecordsAffected {
43 virtual public int VisibleFieldCount {
44 // NOTE: This is virtual because not all providers may choose to support
45 // this property, since it was added in Whidbey
51 abstract public object this [ int ordinal ] {
55 abstract public object this [ string name ] {
59 virtual public void Close()
64 EditorBrowsableAttribute(EditorBrowsableState.Never)
66 public void Dispose() {
70 protected virtual void Dispose(bool disposing) {
76 abstract public string GetDataTypeName(int ordinal);
79 EditorBrowsableAttribute(EditorBrowsableState.Never)
81 abstract public IEnumerator GetEnumerator();
83 abstract public Type GetFieldType(int ordinal);
85 abstract public string GetName(int ordinal);
87 abstract public int GetOrdinal(string name);
89 virtual public DataTable GetSchemaTable()
91 throw new NotSupportedException();
94 abstract public bool GetBoolean(int ordinal);
96 abstract public byte GetByte(int ordinal);
98 abstract public long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length);
100 abstract public char GetChar(int ordinal);
102 abstract public long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length);
105 EditorBrowsableAttribute(EditorBrowsableState.Never)
107 public DbDataReader GetData(int ordinal) {
108 return GetDbDataReader(ordinal);
111 IDataReader IDataRecord.GetData(int ordinal) {
112 return GetDbDataReader(ordinal);
115 virtual protected DbDataReader GetDbDataReader(int ordinal) {
116 // NOTE: This method is virtual because we're required to implement
117 // it however most providers won't support it. Only the OLE DB
118 // provider supports it right now, and they can override it.
119 throw ADP.NotSupported();
122 abstract public DateTime GetDateTime(int ordinal);
124 abstract public Decimal GetDecimal(int ordinal);
126 abstract public double GetDouble(int ordinal);
128 abstract public float GetFloat(int ordinal);
130 abstract public Guid GetGuid(int ordinal);
132 abstract public Int16 GetInt16(int ordinal);
134 abstract public Int32 GetInt32(int ordinal);
136 abstract public Int64 GetInt64(int ordinal);
139 EditorBrowsableAttribute(EditorBrowsableState.Never)
141 virtual public Type GetProviderSpecificFieldType(int ordinal) {
142 // NOTE: This is virtual because not all providers may choose to support
143 // this method, since it was added in Whidbey.
144 return GetFieldType(ordinal);
148 EditorBrowsableAttribute(EditorBrowsableState.Never)
150 virtual public Object GetProviderSpecificValue(int ordinal) {
151 // NOTE: This is virtual because not all providers may choose to support
152 // this method, since it was added in Whidbey
153 return GetValue(ordinal);
157 EditorBrowsableAttribute(EditorBrowsableState.Never)
159 virtual public int GetProviderSpecificValues(object[] values) {
160 // NOTE: This is virtual because not all providers may choose to support
161 // this method, since it was added in Whidbey
162 return GetValues(values);
165 abstract public String GetString(int ordinal);
167 virtual public Stream GetStream(int ordinal) {
168 using (MemoryStream bufferStream = new MemoryStream())
171 long bytesReadTotal = 0;
172 byte[] buffer = new byte[4096];
174 bytesRead = GetBytes(ordinal, bytesReadTotal, buffer, 0, buffer.Length);
175 bufferStream.Write(buffer, 0, (int)bytesRead);
176 bytesReadTotal += bytesRead;
177 } while (bytesRead > 0);
179 return new MemoryStream(bufferStream.ToArray(), false);
183 virtual public TextReader GetTextReader(int ordinal) {
184 if (IsDBNull(ordinal)) {
185 return new StringReader(String.Empty);
188 return new StringReader(GetString(ordinal));
192 abstract public Object GetValue(int ordinal);
194 virtual public T GetFieldValue<T>(int ordinal) {
195 return (T)GetValue(ordinal);
198 public Task<T> GetFieldValueAsync<T>(int ordinal) {
199 return GetFieldValueAsync<T>(ordinal, CancellationToken.None);
202 virtual public Task<T> GetFieldValueAsync<T>(int ordinal, CancellationToken cancellationToken) {
203 if (cancellationToken.IsCancellationRequested) {
204 return ADP.CreatedTaskWithCancellation<T>();
208 return Task.FromResult<T>(GetFieldValue<T>(ordinal));
210 catch (Exception e) {
211 return ADP.CreatedTaskWithException<T>(e);
216 abstract public int GetValues(object[] values);
218 abstract public bool IsDBNull(int ordinal);
220 public Task<bool> IsDBNullAsync(int ordinal) {
221 return IsDBNullAsync(ordinal, CancellationToken.None);
224 virtual public Task<bool> IsDBNullAsync(int ordinal, CancellationToken cancellationToken) {
225 if (cancellationToken.IsCancellationRequested) {
226 return ADP.CreatedTaskWithCancellation<bool>();
230 return IsDBNull(ordinal) ? ADP.TrueTask : ADP.FalseTask;
232 catch (Exception e) {
233 return ADP.CreatedTaskWithException<bool>(e);
238 abstract public bool NextResult();
240 abstract public bool Read();
242 public Task<bool> ReadAsync() {
243 return ReadAsync(CancellationToken.None);
246 virtual public Task<bool> ReadAsync(CancellationToken cancellationToken) {
247 if (cancellationToken.IsCancellationRequested) {
248 return ADP.CreatedTaskWithCancellation<bool>();
252 return Read() ? ADP.TrueTask : ADP.FalseTask;
254 catch (Exception e) {
255 return ADP.CreatedTaskWithException<bool>(e);
260 public Task<bool> NextResultAsync() {
261 return NextResultAsync(CancellationToken.None);
264 virtual public Task<bool> NextResultAsync(CancellationToken cancellationToken) {
265 if (cancellationToken.IsCancellationRequested) {
266 return ADP.CreatedTaskWithCancellation<bool>();
270 return NextResult() ? ADP.TrueTask : ADP.FalseTask;
272 catch (Exception e) {
273 return ADP.CreatedTaskWithException<bool>(e);