前两天需要实现一个上移下移功能,就上网上搜了一下,没想到这个简单的小功能也没有搜到特别理想的结果,只有自己动手丰衣足食了,虽然简单,但是希望对大家有所帮助。
功能:实现任意有排序字段表单的上移和下移,并可以按分类来操作排序。
首先是存储过程:写的稍微有些繁琐:
ALTER PROCEDURE [dbo].[Proc_Common_UpDown]
@Sign int = 0,-- 0: 上移 1:下移
@TableName nvarchar(50),-- 表名
@ItemName nvarchar(50),-- 主键字段名
@ItemID int,-- 主键ID
@SortName nvarchar(50),-- 排序ID
@TypeName nvarchar(50)='',-- 分类字段名
@TypeValue nvarchar(50)= '' -- 分类值
AS
BEGIN
SET NOCOUNT ON
DECLARE
@sql nvarchar(4000),
@ThisSort int,-- 当前ID
@PREVID int,-- 前一个ID
@NextID int,-- 后一个ID
@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),@NextID)
END
END
EXEC(@sql)
END
@Sign int = 0,-- 0: 上移 1:下移
@TableName nvarchar(50),-- 表名
@ItemName nvarchar(50),-- 主键字段名
@ItemID int,-- 主键ID
@SortName nvarchar(50),-- 排序ID
@TypeName nvarchar(50)='',-- 分类字段名
@TypeValue nvarchar(50)= '' -- 分类值
AS
BEGIN
SET NOCOUNT ON
DECLARE
@sql nvarchar(4000),
@ThisSort int,-- 当前ID
@PREVID int,-- 前一个ID
@NextID int,-- 后一个ID
@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),@NextID)
END
END
EXEC(@sql)
END
数据层的公共类:
public class Common
{
public static Database db = DatabaseFactory.CreateDatabase("Huoqk_CMS");
/// <summary>
/// 上移下移
/// </summary>
/// <param name="Sign">移动方向:0 上移, 1下移</param>
/// <param name="TableName">表名</param>
/// <param name="ItemName">主键名</param>
/// <param name="ItemID">主键ID</param>
/// <param name="SortName">排序字段</param>
/// <param name="TypeName">类型名</param>
/// <param name="TypeValue">类型ID</param>
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",ItemName);
db.AddInParameter(dbCommand,"ItemID",ItemID);
db.AddInParameter(dbCommand,"SortName",SortName);
db.AddInParameter(dbCommand,"TypeName",TypeName);
db.AddInParameter(dbCommand,"TypeValue",TypeValue);
db.ExecuteNonQuery(dbCommand);
}
}
{
public static Database db = DatabaseFactory.CreateDatabase("Huoqk_CMS");
/// <summary>
/// 上移下移
/// </summary>
/// <param name="Sign">移动方向:0 上移, 1下移</param>
/// <param name="TableName">表名</param>
/// <param name="ItemName">主键名</param>
/// <param name="ItemID">主键ID</param>
/// <param name="SortName">排序字段</param>
/// <param name="TypeName">类型名</param>
/// <param name="TypeValue">类型ID</param>
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",ItemName);
db.AddInParameter(dbCommand,"ItemID",ItemID);
db.AddInParameter(dbCommand,"SortName",SortName);
db.AddInParameter(dbCommand,"TypeName",TypeName);
db.AddInParameter(dbCommand,"TypeValue",TypeValue);
db.ExecuteNonQuery(dbCommand);
}
}
数据层(DAL)具体的调用:CMS_Channel 表的排序功能:
public void UPDown(int sign,int itemid)
{
Common.UPDown(sign,"CMS_Channel","CID",itemid,"Sort","","");
}
{
Common.UPDown(sign,"CMS_Channel","CID",itemid,"Sort","","");
}
至于业务逻辑层或者Web层的调用基本就很简单了:
UPDown(111,0);上移
UPDown(111,1);下移
UPDown(111,1);下移