Como dice Michael, ciertamente puede implementar un IDataReader, que es la forma más eficiente de hacerlo, pero se requiere un trabajo adicional. Implementar GetSchemaTable es un poco complicado de implementar, pero no es tan malo si usas el siguiente código como punto de partida.
var table = new DataTable("SchemaTable");
table.Locale = CultureInfo.InvariantCulture;
table.Columns.Add(new DataColumn(SchemaTableColumn.ColumnName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(int)));
table.Columns.Add(new DataColumn(SchemaTableColumn.ColumnSize, typeof(int)));
table.Columns.Add(new DataColumn(SchemaTableColumn.NumericPrecision, typeof(short)));
table.Columns.Add(new DataColumn(SchemaTableColumn.NumericScale, typeof(short)));
table.Columns.Add(new DataColumn(SchemaTableColumn.DataType, typeof(Type)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(Type)));
table.Columns.Add(new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(int)));
table.Columns.Add(new DataColumn(SchemaTableColumn.ProviderType, typeof(int)));
table.Columns.Add(new DataColumn(SchemaTableColumn.IsLong, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableColumn.AllowDBNull, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.IsReadOnly, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.IsRowVersion, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableColumn.IsUnique, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableColumn.IsKey, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.IsAutoIncrement, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.IsHidden, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.BaseCatalogName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableColumn.BaseTableName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableColumn.BaseColumnName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableOptionalColumn.BaseServerName, typeof(string)));
table.Columns.Add(new DataColumn(SchemaTableColumn.IsAliased, typeof(bool)));
table.Columns.Add(new DataColumn(SchemaTableColumn.IsExpression, typeof(bool)));
¡Buena idea de usar una DataTable (vacía) para GetSchemaTable solamente! Hace que la implementación de IDataReader sea realmente fácil. La memoria es barata, pero simplemente no puede agregar 100 GB a una computadora portátil;) – realMarkusSchmidt