当前位置:编程学习 > C#/ASP.NET >>

提问:C#作的一个改变排序的过程,可是每次执行都乱套,请高手指点(附代码)

C# 初学者,问题简单,或者高手指点其他方法
下面的代码是实现调换两个相邻记录的排序
ID为表的主键,记录的编号,Order为记录的排序
我想实现,升序时跟上面的记录交换Order,降序时跟下面的记录交换

可是我编写下面代码时,每次执行结果都不一样, 
//改变排序序号
    private void UpdateUpAndDown(string flag, int Id)
    {
        SqlConnection con = DB.CreateCon();
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }

        //提取ID号对应的Order号
        string sqlOrder = "select WebOrder from TWebSite where WebId=" + Id;
        int order = admin_cls.getValue(sqlOrder);
        bool find = false;
        //判断是升序还是降序,提取排序Order上一条或下一条记录的ID和Order
        int tempId=0, tempOrder=0;
        string sql = "";
        switch (flag)
        { 
            case "UP":
                sql = "select top 1 WebId,WebOrder from TWebSite where WebOrder<" + order + " order by WebOrder desc";
                break;
            case "DOWN":
                sql = "select top 1 WebId,WebOrder from TWebSite where WebOrder>" + order + " order by WebOrder";
                break;
            default:
                sql = "";
                break;
        }

        if (sql != "")
        {
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader sdr=cmd.ExecuteReader();
            while (sdr.Read())
            {
                //得到上一个的编号和序号
                tempId = Convert.ToInt32(sdr[0]);
                tempOrder = Convert.ToInt32(sdr[1]);
                find = true;
            }
            sdr.Close();
        }

        Response.Write(Id.ToString() + "-" + order.ToString() + "==" + tempId.ToString() + "-" + tempOrder.ToString()+"<br>");
        //交换排序
        if (find==true)
        {
            SqlCommand cmd1 = new SqlCommand("update TWebSite set WebOrder=" + tempOrder + " where WebId=" + Id, con);
            cmd1.ExecuteNonQuery();
            SqlCommand cmd2 = new SqlCommand("update TWebSite set WebOrder=" + order + " where WebId=" + tempId, con);
            cmd2.ExecuteNonQuery();
//如果不执行IF里面的语句,输出的ID、Order、TempId、TempOrder都没问题
//如果执行里面的语言,每次结果都不同,次序大乱
//
            find = false;
        }
        if (con.State != ConnectionState.Closed)
        {
            con.Close();
        }
    }
    //改变排序 --------------------编程问答-------------------- 恩 这是有问题的
因为 ID,Order,TempId,TempOrder存在相等的情况,这样的情况出现的话,修改时就不能的到预期的结果(事实上,用概率计算一下,只有在极小部分特殊情况下,你才能得到对的结果)

如果想要实现预期功能,需要一张Temp Table来在中间交互
不过这样貌似效率很差,个人建议走其他的路吧 --------------------编程问答-------------------- 至少要保证WebOrder的值是唯一的.
否则一定不能实现你的需求... --------------------编程问答-------------------- 我在Asp代码的时候,就是用的这个算法,可到了C#net就不行了

有啥好的算法吗?提供一个,感谢!万分感谢!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,