暂停车辆的拖拽修改数据库表中的排序字段值

本文详细介绍了如何在树形视图中实现拖拽操作,包括节点的移动与复制,以及数据更新与排序的过程。
     #region 暂停车辆的拖拽
        /*
         *开始拖动节点时发生
         */
        private void tvPause_ItemDrag(object sender, ItemDragEventArgs e)
        {
            TreeNode tn = e.Item as TreeNode;
            //当按住鼠标左键拖动节点时移动节点。
            if (e.Button == MouseButtons.Left)//父节点不允许拖动
            {
                DoDragDrop(e.Item, DragDropEffects.Move);
            }
            else if (e.Button == MouseButtons.Right)//当按住鼠标右键拖动节点时复制节点
            {
                DoDragDrop(e.Item, DragDropEffects.Copy);
            }
        }
        /**
         * 拖放行为完成
         */
        private void tvPause_DragDrop(object sender, DragEventArgs e)
        {
            Point Position = new Point(0, 0);
            TreeNode myNode = null;//选中的节点
            if (e.Data.GetDataPresent(typeof(TreeNode)))
            {
                myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
            }
            else
            {
                MessageBox.Show("error");
            }
            Position.X = e.X;
            Position.Y = e.Y;
            Position = tvPause.PointToClient(Position);
            TreeNode DropNode = tvPause.GetNodeAt(Position);//落下的节点
            // 确定落下的节点不是被拖拽节点本身或者被拖拽节点的子节点
            if (!DropNode.Equals(myNode) && !ContainsNode(DropNode, myNode))
            {
                if (e.Effect == DragDropEffects.Move)
                {
                    DragNodeView(myNode, DropNode, 3);
                }
                else if (e.Effect == DragDropEffects.Copy)
                {
                    myNode.Nodes.Add((TreeNode)DropNode.Clone());
                }
                myNode.Expand();
            }

        }

        private void tvPause_DragOver(object sender, DragEventArgs e)
        {
            Point targetPoint = this.PointToClient(new Point(e.X, e.Y));
            tvPause.SelectedNode = tvPause.GetNodeAt(targetPoint);
        }

        private void tvPause_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.AllowedEffect;
        }
        #endregion

        /// <summary>
        /// 鼠标拖拽效果三个tv公用方法
        /// </summary>
        /// <param name="myNode">鼠标选中的节点</param>
        /// <param name="DropNode">要移动到那个节点下面或者上面的落下节点</param>
        ///  <param name="VehicleStateType_ID">车辆状态类型</param>
        private void DragNodeView(TreeNode myNode, TreeNode DropNode, int VehicleStateType_ID)
        {
            //1找到选中节点的排序
            string sqlmyNode = "SELECT VehicleOrder_ID from EMTinCar where NO='" + myNode.Text + "'";
            string myNodeValue = Common.Conn.SqlHelper.getSqlValue(sqlmyNode);
            //2找到落下的节点的排序
            string sqlDragNode = "SELECT VehicleOrder_ID from EMTinCar where NO='" + DropNode.Text + "'";
            string DragNodeValue = Common.Conn.SqlHelper.getSqlValue(sqlDragNode);
            int NodeValue = Convert.ToInt32(myNodeValue);
            int DragNodes = Convert.ToInt32(DragNodeValue);
             string JuageSql=string.Empty;
             string strupdateSql = string.Empty;
             string strMessage=string.Empty;
            if (NodeValue > DragNodes)
            {
                #region 上移
                //3 小于选中的,大于等于落下的排序加1
                JuageSql = string.Format("exec Up_EMTinCarinfo {0},{1},{2}", VehicleStateType_ID, NodeValue, DragNodes);
                strMessage = Common.Conn.SqlHelper.ExecSql(JuageSql);
                if (strMessage != string.Empty)
                {
                    return;
                }
                #endregion
            }
            else
            {
                #region  下移
                //3把落下的节点的排序,替换之前把之前的排序
                JuageSql = string.Format("exec Up_EMTinCarinfo1 {0},{1},{2}", VehicleStateType_ID, myNodeValue, DragNodeValue);
                strMessage = Common.Conn.SqlHelper.ExecSql(JuageSql);
                if (strMessage != string.Empty)
                {
                    return;
                }
                #endregion
            }

            //4选中节点的排序与落下的节点的排序互换
            DataTable dt = YieldTransitEditBus.getTinByNo(myNode.Text);
            if (dt != null && dt.Rows.Count > 0)
            {
                tin.ID = Convert.ToInt32(dt.Rows[0]["ID"].ToString());
            }
            tin.VehicleOrder_ID = Convert.ToInt32(DragNodeValue);
            tin.VehicleStateType_ID = 3;
            if (YieldTransitEditBus.updateemtin(tin))
            {
                BindDateQueuing();
                BindDatetvDeparture();
                BindDatetvPause();
            }

        }

<think>我们正在讨论瀚高数据库(HighGo DB)中修改字段顺序的问题。在关系型数据库中,字段的顺序在创建时就已经确定,通常直接修改字段顺序并不像在Excel中拖动列那样简单。瀚高数据库基于PostgreSQL,因此其方法类似。 在瀚高数据库中,没有直接修改字段顺序的SQL命令。但是,我们可以通过以下步骤间接实现: 1. 创建一个新,按照想要的字段顺序定义。 2. 将旧的数据插入到新中。 3. 删除旧。 4. 将新重命名为旧名。 注意:在执行这些操作时,需要确保没有其他操作依赖于该(如视图、外键约束、索引等),否则需要先删除这些依赖,并在操作后重新创建。另外,权限也需要重新设置。 另一种方法是使用`ALTER TABLE`语句的`ADD COLUMN`和`DROP COLUMN`,但这种方法通常用于添加或删除列,而不是改变顺序。要改变已有列的顺序,我们仍然需要重定义整个。 但是,瀚高数据库(PostgreSQL)提供了一种更简便的方式:使用`ALTER TABLE ... ALTER COLUMN ... SET POSITION`?实际上,标准PostgreSQL并不支持直接改变列的位置。不过,瀚高数据库可能提供了一些扩展?但根据PostgreSQL的常见做法,通常还是采用重建的方式。 然而,有一个替代方案:我们可以通过系统来调整列的顺序(通过修改系统,但这是不安全的,不推荐)。 因此,推荐使用重建的方式。 步骤详细说明: 假设我们有一个`my_table`,原始字段顺序为:`id, name, age`,现在希望将顺序改为`id, age, name`。 步骤1:创建新,使用新顺序 ```sql CREATE TABLE my_table_new ( id int, age int, name varchar ); ``` 步骤2:复制数据 ```sql INSERT INTO my_table_new (id, age, name) SELECT id, age, name FROM my_table; ``` 步骤3:删除旧 ```sql DROP TABLE my_table; ``` 步骤4:重命名新 ```sql ALTER TABLE my_table_new RENAME TO my_table; ``` 步骤5:重建相关的索引、约束、触发器等。 注意:上述操作会导致被锁定,并且在删除旧时,如果有其他依赖,需要先处理。在生产环境中,需要谨慎操作,并考虑在低峰期进行。 另外,如果很大,复制数据可能会很慢,并且需要足够的磁盘空间。 瀚高数据库(PostgreSQL)还提供了一种更安全的方法:使用事务(确保操作失败可以回滚)和重命名操作。同时,为了避免在复制数据时阻塞过久,可以使用分段复制(分批插入)或者使用工具如pg_dump和pg_restore。 但是,如果特别大,可以考虑使用`CREATE TABLE ... AS SELECT ...`来创建新,但注意这样不会复制约束和索引。 因此,更完整的步骤应该是: 1. 生成创建新的语句,包括所有约束、索引等。可以使用`pg_dump -s -t my_table`来获取的定义,然后修改字段顺序。 2. 在事务中操作: ```sql BEGIN; -- 创建新(按新顺序) CREATE TABLE my_table_new (...); -- 复制数据 INSERT INTO my_table_new SELECT ... FROM my_table; -- 删除旧 DROP TABLE my_table; -- 重命名新 ALTER TABLE my_table_new RENAME TO my_table; -- 重建其他对象(如视图、外键等,如果存在的话,需要重新创建) COMMIT; ``` 注意:在删除旧之前,确保新的数据完整性和正确性。 另外,如果有外键引用,或者被其他的外键引用,或者有视图、触发器等,都需要事先处理。可能需要先删除外键约束,操作后再添加回来。 总结:在瀚高数据库中,修改字段顺序没有直接命令,需要通过重建来实现。操作时需谨慎,尤其是在生产环境中。 相关问题: 1. 在瀚高数据库中如何安全地重建大? 2. 瀚高数据库有哪些方法可以避免在重建时长时间锁定? 3. 瀚高数据库是否支持在线重定义结构(类似Oracle的在线重定义)?</think>在瀚高数据库中调整字段顺序需要间接实现,因为数据库系统不直接支持修改列顺序的操作。以下是详细操作步骤和注意事项: ### 方法:重建结构(推荐) 1. **创建新** 按目标顺序定义新结构: ```sql CREATE TABLE new_table ( id SERIAL PRIMARY KEY, age INT, -- 调整到第二位 name VARCHAR, -- 调整到第三位 -- 其他字段按新顺序定义... ); ``` 2. **迁移数据** 将旧数据插入新(注意字段顺序对应): ```sql INSERT INTO new_table (id, age, name, ...) SELECT id, age, name, ... FROM old_table; ``` 3. **替换结构** ```sql DROP TABLE old_table CASCADE; -- 删除原(谨慎操作!) ALTER TABLE new_table RENAME TO old_table; -- 重命名新 ``` 4. **重建依赖对象** 重新创建视图、索引、触发器等依赖对象(`CASCADE`会自动删除但不会重建)。 ### 注意事项 1. **数据安全** - 操作前务必**备份数据**:`pg_dump -U username -d dbname -t table_name > backup.sql` - 在事务中执行(`BEGIN;`...`COMMIT;`),出错时`ROLLBACK;` 2. **服务影响** - 大操作可能引起长时间锁,建议在维护窗口进行 - 使用`pg_repack`工具可在线重建(减少锁时间) 3. **依赖处理** - 外键约束:需先删除再重建 - 视图/存储过程:检查引用字段名的代码是否需要调整 4. **字段顺序意义** 在关系型数据库中,列顺序不影响: - 查询性能(由索引决定) - 数据存储逻辑(由列定义决定) - 应避免仅为显示顺序调整结构 > ⚠️ 警告:直接修改系统(如`pg_attribute`)会导致数据库损坏,**严禁操作**! ### 替代方案:视图调整 若仅为显示需求,可创建视图: ```sql CREATE VIEW v_reshuffled_table AS SELECT id, age, name, ... -- 按目标顺序选择字段 FROM original_table; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值