1 //------------------------------------------------------------------------------
2 // <copyright file="OleDbEnumerator.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.OleDb {
12 using System.ComponentModel;
13 using System.Data.Common;
14 using System.Globalization;
15 using System.Security;
16 using System.Security.Permissions;
18 public sealed class OleDbEnumerator {
20 public OleDbEnumerator() {
23 public DataTable GetElements() {
24 OleDbConnection.ExecutePermission.Demand();
26 DataTable dataTable = new DataTable("MSDAENUM"); // WebData 112482
27 dataTable.Locale = CultureInfo.InvariantCulture;
28 OleDbDataReader dataReader = GetRootEnumerator();
29 OleDbDataAdapter.FillDataTable(dataReader, dataTable);
33 static public OleDbDataReader GetEnumerator(Type type) {
34 OleDbConnection.ExecutePermission.Demand();
36 return GetEnumeratorFromType(type);
39 static internal OleDbDataReader GetEnumeratorFromType(Type type) { // WebData 99005
40 // will demand security appropriately
41 object value = Activator.CreateInstance(type, System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance, null, null, CultureInfo.InvariantCulture, null);
42 return GetEnumeratorReader(value);
45 static private OleDbDataReader GetEnumeratorReader(object value) {
46 NativeMethods.ISourcesRowset srcrowset = null;
49 srcrowset = (NativeMethods.ISourcesRowset) value;
51 catch(InvalidCastException) {
52 throw ODB.ISourcesRowsetNotSupported();
54 if (null == srcrowset) {
55 throw ODB.ISourcesRowsetNotSupported();
57 value = null; // still held by ISourcesRowset, reused for IRowset
60 IntPtr propSets = ADP.PtrZero;
62 Bid.Trace("<oledb.ISourcesRowset.GetSourcesRowset|API|OLEDB> IID_IRowset\n");
63 OleDbHResult hr = srcrowset.GetSourcesRowset(ADP.PtrZero, ODB.IID_IRowset, propCount, propSets, out value);
64 Bid.Trace("<oledb.ISourcesRowset.GetSourcesRowset|API|OLEDB|RET> %08X{HRESULT}\n", hr);
66 Exception f = OleDbConnection.ProcessResults(hr, null, null);
71 OleDbDataReader dataReader = new OleDbDataReader(null, null, 0, CommandBehavior.Default);
72 dataReader.InitializeIRowset(value, ChapterHandle.DB_NULL_HCHAPTER, ADP.RecordsUnaffected);
73 dataReader.BuildMetaInfo();
74 dataReader.HasRowsRead();
78 static public OleDbDataReader GetRootEnumerator() {
79 OleDbConnection.ExecutePermission.Demand();
82 Bid.ScopeEnter(out hscp, "<oledb.OleDbEnumerator.GetRootEnumerator|API>\n");
84 //readonly Guid CLSID_MSDAENUM = new Guid(0xc8b522d0,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
85 //Type msdaenum = Type.GetTypeFromCLSID(CLSID_MSDAENUM, true);
86 const string PROGID_MSDAENUM = "MSDAENUM";
87 Type msdaenum = Type.GetTypeFromProgID(PROGID_MSDAENUM, true);
88 return GetEnumeratorFromType(msdaenum);
91 Bid.ScopeLeave(ref hscp);