// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.Collections.Generic; namespace System.Data.Common { internal class DataRowDbColumn : DbColumn { private DataColumnCollection schemaColumns; private DataRow schemaRow; public DataRowDbColumn(DataRow readerSchemaRow, DataColumnCollection readerSchemaColumns) { this.schemaRow = readerSchemaRow; this.schemaColumns = readerSchemaColumns; populateFields(); } private void populateFields() { AllowDBNull = GetDbColumnValue(SchemaTableColumn.AllowDBNull); BaseCatalogName = GetDbColumnValue(SchemaTableOptionalColumn.BaseCatalogName); BaseColumnName = GetDbColumnValue(SchemaTableColumn.BaseColumnName); BaseSchemaName = GetDbColumnValue(SchemaTableColumn.BaseSchemaName); BaseServerName = GetDbColumnValue(SchemaTableOptionalColumn.BaseServerName); BaseTableName = GetDbColumnValue(SchemaTableColumn.BaseTableName); ColumnName = GetDbColumnValue(SchemaTableColumn.ColumnName); ColumnOrdinal = GetDbColumnValue(SchemaTableColumn.ColumnOrdinal); ColumnSize = GetDbColumnValue(SchemaTableColumn.ColumnSize); IsAliased = GetDbColumnValue(SchemaTableColumn.IsAliased); IsAutoIncrement = GetDbColumnValue(SchemaTableOptionalColumn.IsAutoIncrement); IsExpression = GetDbColumnValue(SchemaTableColumn.IsExpression); IsHidden = GetDbColumnValue(SchemaTableOptionalColumn.IsHidden); IsIdentity = GetDbColumnValue("IsIdentity"); IsKey = GetDbColumnValue(SchemaTableColumn.IsKey); IsLong = GetDbColumnValue(SchemaTableColumn.IsLong); IsReadOnly = GetDbColumnValue(SchemaTableOptionalColumn.IsReadOnly); IsUnique = GetDbColumnValue(SchemaTableColumn.IsUnique); NumericPrecision = GetDbColumnValue(SchemaTableColumn.NumericPrecision); NumericScale = GetDbColumnValue(SchemaTableColumn.NumericScale); UdtAssemblyQualifiedName = GetDbColumnValue("UdtAssemblyQualifiedName"); DataType = GetDbColumnValue(SchemaTableColumn.DataType); DataTypeName = GetDbColumnValue("DataTypeName"); } private T GetDbColumnValue(string columnName) { if (!schemaColumns.Contains(columnName)) { return default(T); } object schemaObject = schemaRow[columnName]; if (schemaObject is T) { return (T)schemaObject; } return default(T); } } public static class DbDataReaderExtensions { public static System.Collections.ObjectModel.ReadOnlyCollection GetColumnSchema(this DbDataReader reader) { IList columnSchema = new List(); DataTable schemaTable = reader.GetSchemaTable(); DataColumnCollection schemaTableColumns = schemaTable.Columns; foreach (DataRow row in schemaTable.Rows) { DbColumn dbColumn = new DataRowDbColumn(row, schemaTableColumns); columnSchema.Add(dbColumn); } System.Collections.ObjectModel.ReadOnlyCollection readOnlyColumnSchema = new System.Collections.ObjectModel.ReadOnlyCollection(columnSchema); return readOnlyColumnSchema; } public static bool CanGetColumnSchema(this DbDataReader reader) { return true; } } }