Как говорит Майкл, вы, безусловно, можете реализовать IDataReader, который является наиболее эффективным способом сделать это, но для этого требуется дополнительная работа. Реализация GetSchemaTable - это довольно трудная задача, но это не так уж и плохо, если вы используете приведенный ниже код в качестве отправной точки.
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 ) ) );