예제 #1
0
        public static List <ColumnBase> ReadSchemaColumn(String tableName)
        {
            LogUtils.Logs.Log("Begin reading schema column for table:{0}", tableName);
            var query = String.Format(@"SELECT C.*,RK.CNST_NAME, RK.PARENT_COL, RK.PARENT, ISPK, ISUK, UKNAME  
                           FROM  
                                       (SELECT COLUMN_NAME ,IS_NULLABLE ,  DATA_TYPE, 
                                               CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX 
                                       FROM INFORMATION_SCHEMA.COLUMNS   
                                       WHERE TABLE_NAME= '{0}') AS C 
                           LEFT OUTER JOIN 
                                       (SELECT DISTINCT OBJECT_NAME(constraint_object_id) CNST_NAME,COL_NAME(parent_object_id, parent_column_id ) AS CHILD_COL, 
                                                         COL_NAME(referenced_object_id, referenced_column_id ) AS  PARENT_COL, 
                                                         OBJECT_NAME(referenced_object_id) AS PARENT 
                                       FROM sys.foreign_key_columns 
                                       WHERE OBJECT_NAME(parent_object_id) = '{0}')	AS RK 
                           ON C.COLUMN_NAME = RK.CHILD_COL 
                           LEFT OUTER JOIN 
                                       (SELECT  COLUMN_NAME, 
                                       OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsPrimaryKey') ISPK  
                                       FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
                                       WHERE TABLE_NAME='{0}' AND  OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsPrimaryKey') = 1) AS PK  
                           ON C.COLUMN_NAME = PK.COLUMN_NAME  
                           LEFT OUTER JOIN  
                                       (SELECT  COLUMN_NAME,  CONSTRAINT_NAME AS UKNAME , 
                                       OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsUniqueCnst') ISUK 
                                       FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
                                       WHERE TABLE_NAME='{0}' AND OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsUniqueCnst') = 1) AS UK 
                           ON C.COLUMN_NAME = UK.COLUMN_NAME", tableName);
            var table = new DataTable();

            Sql.Fill(query, table);
            var columnList = new List <ColumnBase>();

            foreach (DataRow row in table.Rows)
            {
                var        isPk   = FieldUtils.AsInt(row, "ISPK") == 1;
                var        isUk   = FieldUtils.AsInt(row, "ISUK") == 1;
                var        isRef  = !String.IsNullOrEmpty(FieldUtils.AsText(row, "PARENT_COL"));
                ColumnBase column = null;
                if ((isPk || isUk) && !isRef)
                {
                    column = new PrimaryColumn();
                }
                else if (isRef)
                {
                    column = new ReferenceColumn();
                }
                else
                {
                    column = new NormalColumn();
                }

                column.Name              = FieldUtils.AsText(row, "COLUMN_NAME");
                column.UniqueName        = FieldUtils.AsText(row, "UKNAME");
                column.DataTypeName      = FieldUtils.AsText(row, "DATA_TYPE");
                column.MaxLength         = FieldUtils.AsInt(row, "CHARACTER_MAXIMUM_LENGTH");
                column.NumPrecision      = FieldUtils.AsByte(row, "NUMERIC_PRECISION");
                column.NumPrecisionRadix = FieldUtils.AsInt16(row, "NUMERIC_PRECISION_RADIX");
                column.GenType           = GetGenerateType(column.DataTypeName);
                var setting = default(GenSetting);
                switch (column.GenType)
                {
                case GenerateDataType.String:
                    setting = new GenStringSetting();
                    break;

                case GenerateDataType.DateTime:
                    setting = new GenDateTimeSetting();
                    break;

                case GenerateDataType.Time:
                    setting = new GenDateTimeSetting();
                    break;

                case GenerateDataType.Int:
                    setting = new GenNumSetting();
                    break;

                case GenerateDataType.Long:
                    setting = new GenNumSetting();
                    break;

                case GenerateDataType.Bit:
                    setting = new GenBitSetting();
                    break;

                case GenerateDataType.Uid:
                    setting = new GenSetting();
                    break;

                default:
                    setting = new GenSetting();
                    break;
                }
                column.Setting = setting;
                if (column.ColType.GetType() == typeof(NormalColumn))
                {
                    column.CanNull = FieldUtils.AsBool(row, "IS_NULLABLE");
                }
                else
                {
                    var refCol = column as ReferenceColumn;
                    if (null != refCol)
                    {
                        refCol.CnstName      = FieldUtils.AsText(row, "CNST_NAME");
                        refCol.RefTableName  = FieldUtils.AsText(row, "PARENT");
                        refCol.RefColumnName = FieldUtils.AsText(row, "PARENT_COL");
                    }
                }
                columnList.Add(column);
            }

            LogUtils.Logs.Log("End reading schema column, table:{0}, {1} columns", tableName, columnList.Count);
            return(columnList);
        }