static List <SysColumn> GetTableColumns(SqlConnection sourceConn, string tableName)
    {
        string sql = string.Format("select syscolumns.name,colorder from syscolumns inner join sysobjects on syscolumns.id=sysobjects.id where sysobjects.xtype='U' and sysobjects.name='{0}' order by syscolumns.colid asc", tableName);

        List <SysColumn> columns = new List <SysColumn>();

        using (SqlConnection conn = (SqlConnection)((ICloneable)sourceConn).Clone())
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            conn.Open();


            //SqlDataReader rdr = ;
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    SysColumn column = new SysColumn();
                    column.Name     = reader.GetValue(0).ToString();
                    column.ColOrder = int.Parse(reader.GetValue(1).ToString());

                    columns.Add(column);
                }
            }
            conn.Close();
        }

        return(columns);
    }
        static List <SysColumn> GetTableColumns(SqlConnection sourceConn, string tableName)
        {
            string sql = string.Format("select * from syscolumns inner join sysobjects on syscolumns.id=sysobjects.id where sysobjects.xtype='U' and sysobjects.name='{0}' order by syscolumns.colid asc", tableName);

            List <SysColumn> columns = new List <SysColumn>();

            using (SqlConnection conn = (SqlConnection)((ICloneable)sourceConn).Clone())
            {
                conn.Open();
                using (var reader = conn.ExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        SysColumn column = new SysColumn();
                        column.Name     = reader.GetDbValue("name");
                        column.ColOrder = reader.GetDbValue("colorder");

                        columns.Add(column);
                    }
                }
                conn.Close();
            }

            return(columns);
        }
Beispiel #3
0
        List <SysColumn> GetTableColumns(string tableName)
        {
            string sql = "select syscolumns.name,syscolumns.colorder,syscolumns.isnullable,systypes.xusertype,systypes.name as typename from syscolumns inner join systypes on syscolumns.xusertype=systypes.xusertype inner join sysobjects on syscolumns.id = sysobjects.id where sysobjects.xtype = 'U' and sysobjects.name = @TableName order by syscolumns.colid asc";

            List <SysColumn> columns = new List <SysColumn>();

            using (var reader = this.Session.ExecuteReader(sql, new DbParam("@TableName", tableName)))
            {
                while (reader.Read())
                {
                    SysColumn column = new SysColumn();
                    column.Name       = GetValue <string>(reader, "name");
                    column.ColOrder   = GetValue <int>(reader, "colorder");
                    column.XUserType  = GetValue <int>(reader, "xusertype");
                    column.TypeName   = GetValue <string>(reader, "typename");
                    column.IsNullable = GetValue <bool>(reader, "isnullable");

                    columns.Add(column);
                }

                reader.Close();
            }

            return(columns);
        }
Beispiel #4
0
        public static List <SysColumn> GetTableColumns(SqlConnection sourceConn, string tableName)
        {
            string sql = string.Format("select * from syscolumns inner join sysobjects on syscolumns.id=sysobjects.id where sysobjects.xtype='U' and sysobjects.name='{0}' order by syscolumns.colid asc", tableName);

            List <SysColumn> columns = new List <SysColumn>();

            using (SqlConnection conn = (SqlConnection)((ICloneable)sourceConn).Clone())
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = sql;
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            SysColumn column = new SysColumn();
                            column.Name     = reader["name"].ToString();
                            column.ColOrder = int.Parse(reader["colorder"].ToString());

                            columns.Add(column);
                        }
                    }
                }
                conn.Close();
            }

            return(columns);
        }
        private static List <SysColumn> GetTableColumns(SqlConnection connection, string tableName)
        {
            string sql = string.Format(@"select * from syscolumns
                                         inner join sysobjects on syscolumns.id == sysobjects.id
                                         where sysobjects.xtype = 'U'
                                         and sysobjects.name = '{0}'
                                         order by syscolumns.colid asc", tableName);

            List <SysColumn> columns = new List <SysColumn>();

            using (SqlConnection conn = ((ICloneable)connection).Clone() as SqlConnection)
            {
                conn.Open();
                using (var command = new SqlCommand(sql, conn))
                {
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            SysColumn column = new SysColumn();
                            column.Name     = reader["name"] as string;
                            column.ColOrder = Convert.ToInt32(reader["colorder"]);
                            columns.Add(column);
                        }
                    }
                }
            }

            return(columns);
        }
Beispiel #6
0
 public static string DropColumn(SysColumn column)
 {
     return(string.Join("\n", new string[]
     {
         $"ALTER TABLE {column.qualified_table_name}",
         $"DROP COLUMN [{column.name}]\n"
     }));
 }
Beispiel #7
0
 public static string AlterColumn(SysColumn column)
 {
     return(string.Join("\n", new string[]
     {
         $"ALTER TABLE {column.qualified_table_name}",
         $"ALTER COLUMN [{column.name}] {column.type_definition} {column.nullability}\n"
     }));
 }
Beispiel #8
0
 public static string UpdateIfNull(SysColumn column, string value = null)
 {
     return(string.Join("\n", new string[]
     {
         $"UPDATE {column.qualified_table_name}",
         $"SET {column.name} = { value ?? DefaultValue(column.data_type) }",
         $"WHERE {column.name} IS NULL\n"
     }));
 }
Beispiel #9
0
        private bool DependsOn(SysConstraint constraint, SysColumn column)
        {
            if (constraint == null)
            {
                return(false);
            }
            else if (constraint.columns.Contains(",") && constraint.columns.Split(",").Contains(column.name))
            {
                return(true);
            }
            else if (constraint.columns == column.name)
            {
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// 获取数据库表的所有列
        /// </summary>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public static List <SysColumn> GetTableColumns(string tableName)
        {
            string sql = string.Format(@"select a.name,a.colorder,c.DATA_TYPE,a.isnullable,SUBSTRING(d.text,3,1) defaultValue from 
                syscolumns a inner join sysobjects b on a.id=b.id 
                LEFT JOIN dbo.syscomments d ON a.cdefault  = d.id
                inner join information_schema.columns c  on b.name=c.TABLE_NAME and c.COLUMN_NAME=a.name 
                where b.xtype='U' and b.name='{0}' order by a.colid asc", tableName);

            List <SysColumn> columns = new List <SysColumn>();
            DataTable        dt      = SqlCoreHelper.ExecuteDataSetText(sql, null).Tables[0];

            foreach (DataRow reader in dt.Rows)
            {
                SysColumn column = new SysColumn();
                column.Name     = reader[0].ToString();
                column.ColOrder = Convert.ToInt16(reader[1]);
                column.Type     = reader[2].ToString();
                column.IsNull   = Convert.ToInt32(reader[3]);
                column.Default  = reader[4].ToString();
                columns.Add(column);
            }
            return(columns);
        }
Beispiel #11
0
 public ColumnMapping(SysColumn column)
 {
     this.Column = column;
 }
Beispiel #12
0
 public async Task <ApiResult <string> > UpdateColumn([FromBody] SysColumn parm)
 {
     return(await _sysColumnService.ModifyAsync(parm));
 }
Beispiel #13
0
 public async Task <ApiResult <string> > AddColumn([FromBody] SysColumn model)
 {
     return(await _sysColumnService.AddAsync(model));
 }
Beispiel #14
0
        // drop/add/alter any columns
        private void PatchColumns(StringBuilder builder)
        {
            var source    = sourceObjects.Keys.ToHashSet();
            var target    = targetObjects.Keys.ToHashSet();
            var intersect = source.Intersect(target).Where(name => sourceTypes[sourceObjects[name]] == Enumerations.GetDescription(SQLTypes.UserTable));

            foreach (var tableName in intersect)
            {
                var sourceId    = sourceObjects[tableName];
                var targetId    = targetObjects[tableName];
                var sourceTable = sourceTables[sourceId];

                var sourceCols = sourceColumns[sourceId].Where(c => c.generated_always_type == "0");
                var targetCols = targetColumns[targetId].Where(c => c.generated_always_type == "0" || string.IsNullOrEmpty(sourceTable.history_table));

                var sourceColDictionary = sourceCols.ToDictionary(c => c.name);
                var targetColDictionary = targetCols.ToDictionary(c => c.name);

                var toDrop  = targetCols.Where(c => !sourceColDictionary.ContainsKey(c.name)).ToList();
                var toAdd   = sourceCols.Where(c => !targetColDictionary.ContainsKey(c.name)).ToList();
                var toAlter = sourceCols.Where(source =>
                {
                    if (!targetColDictionary.ContainsKey(source.name))
                    {
                        return(false);
                    }
                    var target = targetColDictionary[source.name];
                    return(source.type_definition != target.type_definition);
                }).ToList();

                if (toDrop.Any() || toAdd.Any() || toAlter.Any())
                {
                    builder.Append($"-- {tableName} --\n");

                    var targetObjConstraints = targetConstraints.Values.Where(c => c.parent_object_id == targetId);
                    var primaryKey           = targetObjConstraints.Where(c => c.type == Enumerations.GetDescription(SQLTypes.PrimaryKey)).FirstOrDefault();

                    toDrop.ForEach(column =>
                    {
                        builder.Append(Query.DropColumn(column));
                        builder.Append(Query.BatchSeperator);
                    });
                    toAdd.ForEach(column =>
                    {
                        if (column.isNullable)
                        {
                            builder.Append(Query.AddColumn(column));
                            builder.Append(Query.BatchSeperator);
                        }
                        else
                        {
                            var nullable         = SysColumn.DeepClone(column);
                            nullable.is_nullable = "true";
                            builder.Append(Query.AddColumn(nullable));
                            builder.Append(Query.BatchSeperator);
                            builder.Append(Query.UpdateIfNull(column));
                            builder.Append(Query.BatchSeperator);
                            toAlter.Add(column);
                        }
                    });
                    toAlter.ForEach(column =>
                    {
                        if (DependsOn(primaryKey, column))
                        {
                            builder.Append(Query.DropPrimaryKey(primaryKey));
                            builder.Append(Query.BatchSeperator);
                        }
                        builder.Append(Query.AlterColumn(column));
                        builder.Append(Query.BatchSeperator);
                    });
                }
            }
        }
  public DatabaseImp( string dirName )
  {
    Name = dirName;
    Log = new Log( Name );
    Sys = GetSchema( "sys", true, null );

    {
      SysString = OpenFile(  FileType.System, 0 );
      SysStringReader = new BinaryReader( SysString );
      SysStringWriter = new BinaryWriter( SysString );

      IndexFileInfo ii = new IndexFileInfo();
      ii.KeyCount = 1;
      ii.Types = new DataType[] { DataType.String };
      var f = OpenFile( FileType.System, 1 );
      SysStringIndex = new IndexFile( f, ii, this, -1 );
    }

    {
      SysBinary = OpenFile( FileType.System, 2 );
      SysBinaryReader = new BinaryReader( SysBinary );
      SysBinaryWriter = new BinaryWriter( SysBinary );

      IndexFileInfo ii = new IndexFileInfo();
      ii.KeyCount = 1;
      ii.Types = new DataType[] { DataType.Binary };
      var f = OpenFile( FileType.System, 3 );
      SysBinaryIndex = new IndexFile( f, ii, this, -2 );
    }

    var cb = new ColBuilder();

    cb.Add( "Name", DataType.String );
    SysSchema = NewSysTable( 1, "Schema", cb.Get() );

    cb.Add( "Schema", DataType.Int );
    cb.Add( "Name",   DataType.String );
    cb.Add( "IsView", DataType.Tinyint );
    cb.Add( "Definition", DataType.String );
    SysTable = NewSysTable( 2, "Table", cb.Get() );

    cb.Add( "Table",    DataType.Int );
    cb.Add( "Name",     DataType.String );
    cb.Add( "Type",     DataType.Int );
    SysColumn = NewSysTable( 3, "Column", cb.Get() );

    cb.Add( "Table",    DataType.Int );
    cb.Add( "Name",     DataType.String );
    cb.Add( "Modified", DataType.Tinyint );
    SysIndex = NewSysTable( 4, "Index", cb.Get() );

    cb.Add( "Table",    DataType.Int );
    cb.Add( "Index",    DataType.Int );
    cb.Add( "ColId",    DataType.Int );
    SysIndexCol = NewSysTable( 5, "IndexCol", cb.Get() );

    SysColumn.OpenIndexes( IndexInfo.Single( 1, 1 ) );
    SysColumnIndex = SysColumn.FindIndex( 1 );

    SysIndexCol.OpenIndexes( IndexInfo.Single( 2, 1) );
    SysIndexColIndex = SysIndexCol.FindIndex( 1 );

    SysSchema.OpenIndexes( IndexInfo.Single( 3, 1 ) );
    SysSchemaByName = SysSchema.FindIndex( 1 );

    SysTable.OpenIndexes( IndexInfo.Single( 4, 2 ) );
    SysTableByName = SysTable.FindIndex( 2 );

    if ( SysSchema.RowCount == 0 )
    {
      IsNew = true;
      Sql( "CREATE SCHEMA sys" ); // Note these are created in TableId order.
      Sql( "CREATE TABLE sys.Schema( Name string )" );
      Sql( "CREATE TABLE sys.Table( Schema int, Name string, IsView tinyint, Definition string )" );
      Sql( "CREATE TABLE sys.Column( Table int, Name string, Type int )" );
      Sql( "CREATE TABLE sys.Index( Table int, Name string, Modified tinyint )" );
      Sql( "CREATE TABLE sys.IndexCol( Table int, Index int, ColId int )" );
      Sql( "CREATE INDEX ColumnByTable on sys.Column(Table)" );
      Sql( "CREATE INDEX IndexColByTable on sys.IndexCol(Table)" );
      Sql( "CREATE INDEX SchemaByName on sys.Schema(Name)" );
      Sql( "CREATE INDEX TableByName on sys.Table(Name)" );
      Normal = true;

      Sql( "CREATE TABLE sys.Function( Schema int, Name string, Definition string )" );
      Sql( "CREATE INDEX FunctionByName on sys.Function(Name)" );

      Sql( "CREATE TABLE sys.Procedure( Schema int, Name string, Definition string )" );
      Sql( "CREATE INDEX ProcedureByName on sys.Procedure(Name)" );
    }
    RollbackOrCommit();
    Normal = true;
  } // end DatabaseImp