首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

通用排序上移下移功能:預存程序與資料層完整實作

     編輯:關於.NET

需求:任意具排序欄位的表單實現上移/下移,支援分類分組排序。網路搜尋無理想結果,自行實作分享。

一、預存程序:Proc_Common_UpDown


ALTER PROCEDURE [dbo].[Proc_Common_UpDown]
    @Sign int = 0,              -- 0:上移 1:下移
    @TableName nvarchar(50),    -- 表名
    @ItemName nvarchar(50),     -- 主鍵欄位名
    @ItemID int,                -- 主鍵值
    @SortName nvarchar(50),     -- 排序欄位名
    @TypeName nvarchar(50)='',  -- 分類欄位名
    @TypeValue nvarchar(50)=''  -- 分類值
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @SQL nvarchar(4000), @ThisSort int, @PREVID int, @NextID int, @Count int

    -- 建立暫時索引表
    CREATE TABLE #Tab (ItemID int, Sort int)
    SET @SQL = 'INSERT INTO #Tab (ItemID,Sort) SELECT ' + @ItemName + ',' + @SortName + ' FROM ' + @TableName
    IF (@TypeName<>'' AND @TypeValue<>'') SET @SQL = @SQL + ' WHERE ' + @TypeName + '=' + @TypeValue
    SET @SQL = @SQL + ' ORDER BY Sort ASC'
    EXEC(@SQL)
    SET @SQL = ''

    SELECT @Count = COUNT(*) FROM #Tab
    SELECT @ThisSort = Sort FROM #Tab WHERE ItemID = @ItemID
    IF(@ThisSort>1) SELECT @PREVID = ItemID FROM #Tab WHERE Sort=(@ThisSort-1)
    IF(@ThisSort<@Count) SELECT @NextID = ItemID FROM #Tab WHERE Sort=(@ThisSort+1)

    IF(@Sign=0) BEGIN  -- 上移
        IF(@ThisSort>1) BEGIN
            SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),(@ThisSort-1)) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@ItemID) + ';'
            + 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),@ThisSort) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@PREVID)
        END
    END ELSE BEGIN      -- 下移
        IF(@ThisSort<@Count) BEGIN
            SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),(@ThisSort+1)) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@ItemID) + ';'
            + 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),@ThisSort) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@NextID)
        END
    END
    EXEC(@SQL)
END

二、資料層公共類


public class Common {
    public static Database db = DatabaseFactory.CreateDatabase("Huoqk_CMS");
    public static void UPDown(int Sign, string TableName, string ItemName, int ItemID, string SortName, string TypeName, string TypeValue) {
        string spName = "Proc_Common_UpDown";
        DbCommand dbCommand = db.GetStoredProcCommand(spName);
        db.AddInParameter(dbCommand, "Sign", DbType.Int32, Sign);
        db.AddInParameter(dbCommand, "TableName", DbType.String, TableName);
        db.AddInParameter(dbCommand, "ItemName", DbType.String, ItemName);
        db.AddInParameter(dbCommand, "ItemID", DbType.Int32, ItemID);
        db.AddInParameter(dbCommand, "SortName", DbType.String, SortName);
        db.AddInParameter(dbCommand, "TypeName", DbType.String, TypeName);
        db.AddInParameter(dbCommand, "TypeValue", DbType.String, TypeValue);
        db.ExecuteNonQuery(dbCommand);
    }
}

三、DAL 具體調用 (CMS_Channel 表)


public void UPDown(int sign, int itemid) {
    Common.UPDown(sign, "CMS_Channel", "CID", itemid, "Sort", "", "");
}

四、BLL/UI 層調用


// 上移
UPDown(111, 0);
// 下移
UPDown(111, 1);

五、設計要點

  • 動態 SQL:支援任意表名、欄位名、分類欄位
  • 暫時表排序:依 Sort ASC 建立索引,精確找出前後相鄰記錄
  • 雙向更新:同時更新目標記錄與相鄰記錄的排序值,交換位置
  • 邊界保護:首筆不可上移、末筆不可下移
  • 分類隔離:同分類內排序,跨分類不干擾

雖然程式碼略顯囉嗦 (深夜趕工),但功能完整、通用性強,可直接套用於任何需排序上移下移的業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved