2 // System.Data.OleDb.OleDbDataReader
5 // Rodrigo Moya (rodrigo@ximian.com)
6 // Tim Coleman (tim@timcoleman.com)
8 // Copyright (C) Rodrigo Moya, 2002
9 // Copyright (C) Tim Coleman, 2002
12 using System.Collections;
13 using System.ComponentModel;
15 using System.Data.Common;
16 using System.Runtime.InteropServices;
18 namespace System.Data.OleDb
20 public sealed class OleDbDataReader : MarshalByRefObject, IDataReader, IDisposable, IDataRecord, IEnumerable
24 private OleDbCommand command;
26 private ArrayList gdaResults;
27 private int currentResult;
28 private int currentRow;
34 internal OleDbDataReader (OleDbCommand command, ArrayList results)
36 this.command = command;
37 this.command.Connection.DataReader = this;
42 gdaResults = new ArrayList ();
53 return 0; // no nested selects supported
57 public int FieldCount {
59 if (currentResult < 0 ||
60 currentResult >= gdaResults.Count)
63 return libgda.gda_data_model_get_n_columns (
64 (IntPtr) gdaResults[currentResult]);
68 public bool IsClosed {
74 public object this[string name] {
78 if (currentResult == -1)
79 throw new InvalidOperationException ();
81 pos = libgda.gda_data_model_get_column_position (
82 (IntPtr) gdaResults[currentResult],
85 throw new IndexOutOfRangeException ();
91 public object this[int index] {
93 return (object) GetValue (index);
97 public int RecordsAffected {
101 if (currentResult < 0 ||
102 currentResult >= gdaResults.Count)
105 total_rows = libgda.gda_data_model_get_n_rows (
106 (IntPtr) gdaResults[currentResult]);
107 if (total_rows > 0) {
108 if (FieldCount > 0) {
109 // It's a SELECT statement
114 return FieldCount > 0 ? -1 : total_rows;
124 for (int i = 0; i < gdaResults.Count; i++) {
125 IntPtr obj = (IntPtr) gdaResults[i];
126 libgda.FreeObject (obj);
136 this.command.Connection.DataReader = null;
145 public bool GetBoolean (int ordinal)
149 if (currentResult == -1)
150 throw new InvalidCastException ();
152 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
153 ordinal, currentRow);
154 if (value == IntPtr.Zero)
155 throw new InvalidCastException ();
157 if (libgda.gda_value_get_vtype (value) != GdaValueType.Boolean)
158 throw new InvalidCastException ();
159 return libgda.gda_value_get_boolean (value);
162 public byte GetByte (int ordinal)
166 if (currentResult == -1)
167 throw new InvalidCastException ();
169 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
170 ordinal, currentRow);
171 if (value == IntPtr.Zero)
172 throw new InvalidCastException ();
174 if (libgda.gda_value_get_vtype (value) != GdaValueType.Tinyint)
175 throw new InvalidCastException ();
176 return libgda.gda_value_get_tinyint (value);
180 public long GetBytes (int ordinal, long dataIndex, byte[] buffer, int bufferIndex, int length)
182 throw new NotImplementedException ();
185 public char GetChar (int ordinal)
189 if (currentResult == -1)
190 throw new InvalidCastException ();
192 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
193 ordinal, currentRow);
194 if (value == IntPtr.Zero)
195 throw new InvalidCastException ();
197 if (libgda.gda_value_get_vtype (value) != GdaValueType.Tinyint)
198 throw new InvalidCastException ();
199 return (char) libgda.gda_value_get_tinyint (value);
203 public long GetChars (int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length)
205 throw new NotImplementedException ();
209 public OleDbDataReader GetData (int ordinal)
211 throw new NotImplementedException ();
214 public string GetDataTypeName (int index)
219 if (currentResult == -1)
223 attrs = libgda.gda_data_model_describe_column ((IntPtr) gdaResults[currentResult],
225 if (attrs == IntPtr.Zero)
228 type = libgda.gda_field_attributes_get_gdatype (attrs);
229 libgda.gda_field_attributes_free (attrs);
231 return libgda.gda_type_to_string (type);
234 public DateTime GetDateTime (int ordinal)
239 if (currentResult == -1)
240 throw new InvalidCastException ();
242 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
243 ordinal, currentRow);
244 if (value == IntPtr.Zero)
245 throw new InvalidCastException ();
247 if (libgda.gda_value_get_vtype (value) == GdaValueType.Date) {
250 gdt = (GdaDate) Marshal.PtrToStructure (libgda.gda_value_get_date (value),
252 return new DateTime ((int) gdt.year, (int) gdt.month, (int) gdt.day);
253 } else if (libgda.gda_value_get_vtype (value) == GdaValueType.Time) {
256 gdt = (GdaTime) Marshal.PtrToStructure (libgda.gda_value_get_time (value),
258 return new DateTime (0, 0, 0, (int) gdt.hour, (int) gdt.minute, (int) gdt.second, 0);
259 } else if (libgda.gda_value_get_vtype (value) == GdaValueType.Timestamp) {
262 gdt = (GdaTimestamp) Marshal.PtrToStructure (libgda.gda_value_get_timestamp (value),
263 typeof (GdaTimestamp));
265 return new DateTime ((int) gdt.year, (int) gdt.month, (int) gdt.day,
266 (int) gdt.hour, (int) gdt.minute, (int) gdt.second,
270 throw new InvalidCastException ();
274 public decimal GetDecimal (int ordinal)
276 throw new NotImplementedException ();
279 public double GetDouble (int ordinal)
283 if (currentResult == -1)
284 throw new InvalidCastException ();
286 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
287 ordinal, currentRow);
288 if (value == IntPtr.Zero)
289 throw new InvalidCastException ();
291 if (libgda.gda_value_get_vtype (value) != GdaValueType.Double)
292 throw new InvalidCastException ();
293 return libgda.gda_value_get_double (value);
297 public Type GetFieldType (int index)
299 throw new NotImplementedException ();
302 public float GetFloat (int ordinal)
306 if (currentResult == -1)
307 throw new InvalidCastException ();
309 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
310 ordinal, currentRow);
311 if (value == IntPtr.Zero)
312 throw new InvalidCastException ();
314 if (libgda.gda_value_get_vtype (value) != GdaValueType.Single)
315 throw new InvalidCastException ();
316 return libgda.gda_value_get_single (value);
320 public Guid GetGuid (int ordinal)
322 throw new NotImplementedException ();
325 public short GetInt16 (int ordinal)
329 if (currentResult == -1)
330 throw new InvalidCastException ();
332 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
333 ordinal, currentRow);
334 if (value == IntPtr.Zero)
335 throw new InvalidCastException ();
337 if (libgda.gda_value_get_vtype (value) != GdaValueType.Smallint)
338 throw new InvalidCastException ();
339 return (short) libgda.gda_value_get_smallint (value);
342 public int GetInt32 (int ordinal)
346 if (currentResult == -1)
347 throw new InvalidCastException ();
349 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
350 ordinal, currentRow);
351 if (value == IntPtr.Zero)
352 throw new InvalidCastException ();
354 if (libgda.gda_value_get_vtype (value) != GdaValueType.Integer)
355 throw new InvalidCastException ();
356 return libgda.gda_value_get_integer (value);
359 public long GetInt64 (int ordinal)
363 if (currentResult == -1)
364 throw new InvalidCastException ();
366 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
367 ordinal, currentRow);
368 if (value == IntPtr.Zero)
369 throw new InvalidCastException ();
371 if (libgda.gda_value_get_vtype (value) != GdaValueType.Bigint)
372 throw new InvalidCastException ();
373 return libgda.gda_value_get_bigint (value);
376 public string GetName (int index)
378 if (currentResult == -1)
381 return libgda.gda_data_model_get_column_title (
382 (IntPtr) gdaResults[currentResult], index);
385 public int GetOrdinal (string name)
387 if (currentResult == -1)
388 throw new IndexOutOfRangeException ();
390 for (int i = 0; i < FieldCount; i++) {
391 if (GetName (i) == name)
395 throw new IndexOutOfRangeException ();
398 public DataTable GetSchemaTable ()
400 DataTable table = new DataTable ();
406 public string GetString (int ordinal)
410 if (currentResult == -1)
411 throw new InvalidCastException ();
413 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
414 ordinal, currentRow);
415 if (value == IntPtr.Zero)
416 throw new InvalidCastException ();
418 if (libgda.gda_value_get_vtype (value) != GdaValueType.String)
419 throw new InvalidCastException ();
420 return libgda.gda_value_get_string (value);
424 public TimeSpan GetTimeSpan (int ordinal)
426 throw new NotImplementedException ();
429 public object GetValue (int ordinal)
434 if (currentResult == -1)
435 throw new IndexOutOfRangeException ();
437 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
438 ordinal, currentRow);
439 if (value == IntPtr.Zero)
440 throw new IndexOutOfRangeException ();
442 type = libgda.gda_value_get_vtype (value);
444 case GdaValueType.Bigint : return GetInt64 (ordinal);
445 case GdaValueType.Boolean : return GetBoolean (ordinal);
446 case GdaValueType.Date : return GetDateTime (ordinal);
447 case GdaValueType.Double : return GetDouble (ordinal);
448 case GdaValueType.Integer : return GetInt32 (ordinal);
449 case GdaValueType.Single : return GetFloat (ordinal);
450 case GdaValueType.Smallint : return GetByte (ordinal);
451 case GdaValueType.String : return GetString (ordinal);
452 case GdaValueType.Time : return GetDateTime (ordinal);
453 case GdaValueType.Timestamp : return GetDateTime (ordinal);
454 case GdaValueType.Tinyint : return GetByte (ordinal);
457 return (object) libgda.gda_value_stringify (value);
461 public int GetValues (object[] values)
463 throw new NotImplementedException ();
467 IDataReader IDataRecord.GetData (int ordinal)
469 throw new NotImplementedException ();
473 void IDisposable.Dispose ()
475 throw new NotImplementedException ();
479 IEnumerator IEnumerable.GetEnumerator ()
481 throw new NotImplementedException ();
484 public bool IsDBNull (int ordinal)
488 if (currentResult == -1)
489 throw new IndexOutOfRangeException ();
491 value = libgda.gda_data_model_get_value_at ((IntPtr) gdaResults[currentResult],
492 ordinal, currentRow);
493 if (value == IntPtr.Zero)
494 throw new IndexOutOfRangeException ();
496 return libgda.gda_value_is_null (value);
499 public bool NextResult ()
501 int i = currentResult + 1;
502 if (i >= 0 && i < gdaResults.Count) {
512 if (currentResult < 0 ||
513 currentResult >= gdaResults.Count)
518 libgda.gda_data_model_get_n_rows ((IntPtr) gdaResults[currentResult]))