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;
}