System.Data.SqlClient.SqlDataReader.SqlDataReader.GetSchemaTable C# (CSharp) Method

GetSchemaTable() public method

public GetSchemaTable ( ) : DataTable
return System.Data.DataTable
		DataTable GetSchemaTable ()
		{
			ValidateState ();

			if (schemaTable == null)
				schemaTable = ConstructSchemaTable ();

			if (schemaTable.Rows != null && schemaTable.Rows.Count > 0)
				return schemaTable;

			if (!moreResults)
				return null;

			foreach (TdsDataColumn schema in command.Tds.Columns) {
				DataRow row = schemaTable.NewRow ();

#if NET_2_0
				row [COLUMN_NAME_IDX]		= GetSchemaValue (schema.ColumnName);
				row [COLUMN_ORDINAL_IDX]		= GetSchemaValue (schema.ColumnOrdinal);
				row [IS_UNIQUE_IDX]		= GetSchemaValue (schema.IsUnique);
				row [IS_AUTO_INCREMENT_IDX]		= GetSchemaValue (schema.IsAutoIncrement);
				row [IS_ROW_VERSION_IDX]		= GetSchemaValue (schema.IsRowVersion);
				row [IS_HIDDEN_IDX]		= GetSchemaValue (schema.IsHidden);
				row [IS_IDENTITY_IDX]		= GetSchemaValue (schema.IsIdentity);
				row [NUMERIC_PRECISION_IDX]	= GetSchemaValue (schema.NumericPrecision);
				row [IS_KEY_IDX]			= GetSchemaValue (schema.IsKey);
				row [IS_ALIASED_IDX]		= GetSchemaValue (schema.IsAliased);
				row [IS_EXPRESSION_IDX]		= GetSchemaValue (schema.IsExpression);
				row [IS_READ_ONLY_IDX]		= GetSchemaValue (schema.IsReadOnly);
				row [BASE_SERVER_NAME_IDX]		= GetSchemaValue (schema.BaseServerName);
				row [BASE_CATALOG_NAME_IDX]		= GetSchemaValue (schema.BaseCatalogName);
				row [BASE_COLUMN_NAME_IDX]		= GetSchemaValue (schema.BaseColumnName);
				row [BASE_SCHEMA_NAME_IDX]		= GetSchemaValue (schema.BaseSchemaName);
				row [BASE_TABLE_NAME_IDX]		= GetSchemaValue (schema.BaseTableName);
				row [ALLOW_DBNULL_IDX]		= GetSchemaValue (schema.AllowDBNull);
				row [PROVIDER_SPECIFIC_TYPE_IDX] = DBNull.Value;
				row [DATA_TYPE_NAME_IDX] = GetSchemaValue (schema.DataTypeName);
				row [XML_SCHEMA_COLLCTN_DB_IDX] = DBNull.Value;
				row [XML_SCHEMA_COLLCTN_OWN_SCHEMA_IDX] = DBNull.Value;
				row [XML_SCHEMA_COLLCTN_NAME_IDX] = DBNull.Value;
				row [UDT_ASMBLY_QUALIFIED_NAME_IDX] = DBNull.Value;
				row [NON_VER_PROVIDER_TYPE_IDX] = DBNull.Value;
				row [IS_COLUMN_SET] = DBNull.Value;
#else
				row [COLUMN_NAME_IDX]		= GetSchemaValue (schema, "ColumnName");
				row [COLUMN_ORDINAL_IDX]		= GetSchemaValue (schema, "ColumnOrdinal");
				row [IS_UNIQUE_IDX]		= GetSchemaValue (schema, "IsUnique");
				row [IS_AUTO_INCREMENT_IDX]		= GetSchemaValue (schema, "IsAutoIncrement");
				row [IS_ROW_VERSION_IDX]		= GetSchemaValue (schema, "IsRowVersion");
				row [IS_HIDDEN_IDX]		= GetSchemaValue (schema, "IsHidden");
				row [IS_IDENTITY_IDX]		= GetSchemaValue (schema, "IsIdentity");
				row [IS_KEY_IDX]			= GetSchemaValue (schema, "IsKey");
				row [IS_ALIASED_IDX]		= GetSchemaValue (schema, "IsAliased");
				row [IS_EXPRESSION_IDX]		= GetSchemaValue (schema, "IsExpression");
				row [IS_READ_ONLY_IDX]		= GetSchemaValue (schema, "IsReadOnly");
				row [BASE_SERVER_NAME_IDX]		= GetSchemaValue (schema, "BaseServerName");
				row [BASE_CATALOG_NAME_IDX]		= GetSchemaValue (schema, "BaseCatalogName");
				row [BASE_COLUMN_NAME_IDX]		= GetSchemaValue (schema, "BaseColumnName");
				row [BASE_SCHEMA_NAME_IDX]		= GetSchemaValue (schema, "BaseSchemaName");
				row [BASE_TABLE_NAME_IDX]		= GetSchemaValue (schema, "BaseTableName");
				row [ALLOW_DBNULL_IDX]		= GetSchemaValue (schema, "AllowDBNull");
#endif
				// We don't always get the base column name.
				if (row [BASE_COLUMN_NAME_IDX] == DBNull.Value)
					row [BASE_COLUMN_NAME_IDX] = row [COLUMN_NAME_IDX];

				TdsColumnType ctype;
				int csize, dbType;
				Type fieldType;
				bool isLong;
				string typeName;
				short precision;
				short scale;
#if NET_2_0
				ctype = (TdsColumnType) schema.ColumnType;
				csize = (int) schema.ColumnSize;
				precision = (short) GetSchemaValue (schema.NumericPrecision);
				scale = (short) GetSchemaValue (schema.NumericScale);
#else
				ctype = (TdsColumnType) schema ["ColumnType"];
				csize = (int) schema ["ColumnSize"];
				precision = (short) ((byte) GetSchemaValue (schema, "NumericPrecision"));
				scale = (short) ((byte) GetSchemaValue (schema, "NumericScale"));
#endif

				GetSchemaRowType (ctype, csize, precision, scale,
					out dbType, out fieldType, out isLong,
					out typeName);
				
				row [COLUMN_SIZE_IDX] = csize;
				row [NUMERIC_PRECISION_IDX] = precision;
				row [NUMERIC_SCALE_IDX] = scale;
				row [PROVIDER_TYPE_IDX] = dbType;
				row [DATA_TYPE_IDX] = fieldType;
				row [IS_LONG_IDX] = isLong;
#if NET_2_0
				if ((bool)row [IS_HIDDEN_IDX] == false)
					visibleFieldCount += 1;
#endif

				schemaTable.Rows.Add (row);
			}
			return schemaTable;
		}