private void SetColumnMetaData(object compilationColumns, int hiddenColumns) { Debug.WriteLineIf(CLI.FnTrace.Enabled, "ManagedCommand.SetColumnMetaData"); object[] descriptions = null; if (compilationColumns is object[]) { descriptions = (object[])compilationColumns; } if (descriptions == null || descriptions.Length == 0) { columns = null; return; } bool hasKeyColumns = false; columns = new ColumnData[descriptions.Length]; for (int i = 0; i < columns.Length; i++) { object[] description = (object[])descriptions[i]; ColumnData column = new ColumnData(); columns[i] = column; ColumnFlags flags = (ColumnFlags)description[11]; column.columnName = (string)description[0]; column.columnType = DataTypeInfo.MapDvType((BoxTag)description[1]); if (0 != (flags & ColumnFlags.CDF_XMLTYPE)) { Debug.WriteLineIf(SqlXml.Switch.TraceVerbose, String.Format("Set XML type for {0}", column.columnName)); column.columnType = DataTypeInfo.Xml; } if (column.columnType == null) { throw new SystemException("Unknown data type"); } column.bufferType = column.columnType.bufferType; column.columnSize = column.columnType.GetFieldSize((int)description[3]); column.precision = (short)column.columnSize; column.scale = (short)((int)description[2]); column.IsLong = column.columnType.isLong; column.IsNullable = (0 != (int)description[4]); CLI.Updatable updatable = (CLI.Updatable)(int) description[5]; column.IsReadOnly = (updatable == CLI.Updatable.SQL_ATTR_READONLY); column.IsAutoIncrement = (0 != (flags & ColumnFlags.CDF_AUTOINCREMENT)); column.IsKey = (0 != (flags & ColumnFlags.CDF_KEY)); if (column.IsKey) { hasKeyColumns = true; } column.IsHidden = (i >= (columns.Length - hiddenColumns)); column.IsRowVersion = (column.columnType == DataTypeInfo.Timestamp); // TODO: check for unique columns as well. column.IsUnique = false; column.baseCatalogName = (string)Values.NullIfZero(description[7]); column.baseColumnName = (string)Values.NullIfZero(description[8]); column.baseSchemaName = (string)Values.NullIfZero(description[9]); column.baseTableName = (string)Values.NullIfZero(description[10]); if (column.baseTableName == null || column.baseTableName == "") { column.IsExpression = true; } else { column.IsExpression = false; } } if (uniqueRows && !hasKeyColumns) { uniqueRows = false; } }