Exemple #1
0
        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;
            }
        }