sqlserver 存储过程学习笔记(二) 在项目中的应用<多表分页>
(1)存储过程建立
USE [NewPlat] GO
/****** Object: StoredProcedure [dbo].[usp_PagingLarge] Script Date: 07/11/2013 08:27:44 ******/ SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
Create PROCEDURE [dbo].[usp_PagingLarge]
@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
@Fields VARCHAR(4000), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT, --每页记录数
@CurrentPage INT, --当前页,0表示第1页
@Filter VARCHAR(4000) = '', --条件,可以为空,不用填 where
@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = '', --排序,可以为空,为空默认按主键升序排列,不用填 order by
@RecordCount int OUTPUT --总记录数,自己增加(总记录数)
AS
BEGIN
DECLARE @SortColumn VARCHAR(200)
DECLARE @Operator CHAR(2)
DECLARE @SortTable VARCHAR(200)
DECLARE @SortName VARCHAR(200)
IF @Fields = ''
SET @Fields = '*'
IF @Filter = ''
SET @Filter = 'Where 1=1'
ELSE
SET @Filter = 'Where ' + @Filter
IF @Group <>''
SET @Group = 'GROUP BY ' + @Group
IF @Order <> ''
BEGIN
DECLARE @pos1 INT, @pos2 INT
SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
IF CHARINDEX(' DESC', @Order) > 0
IF CHARINDEX(' ASC', @Order) > 0
BEGIN
IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
SET @Operator = '<='
ELSE
SET @Operator = '>='
END
ELSE
SET @Operator = '<='
ELSE
SET @Operator = '>='
SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
SET @pos1 = CHARINDEX(',', @SortColumn)
IF @pos1 > 0
SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
SET @pos2 = CHARINDEX('.', @SortColumn)
IF @pos2 > 0
BEGIN
SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
IF @pos1 > 0
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
ELSE
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET @SortTable = @TableNames
SET @SortName = @SortColumn
END
END
ELSE
BEGIN
SET @SortColumn = @PrimaryKey
SET @SortTable = @TableNames
SET @SortName = @SortColumn
SET @Order = @SortColumn
SET @Operator = '>='
END
DECLARE @type varchar(50)
DECLARE @prec int
Select @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @TopRows INT
SET @TopRows = @PageSize * @CurrentPage + 1
print @TopRows
print @Operator
EXEC(' DECLARE @SortColumnBegin ' + @type + ' SET ROWCOUNT ' + @TopRows + ' Select @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + ' SET ROWCOUNT ' + @PageSize + ' Select ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + ' ')
IF @RecordCount IS NULL
BEGIN DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @RecordCount=COUNT(*)' +N' FROM '+@TableNames +N' '+@Filter
EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
END
END
GO
(2)实现多表分页的函数(c#代码)
public static DataTable ExecMultiPageList(string tableName, string iDName, string Fields, int pageSize, int currentPage, string Filter, string Group, string Order, List<SqlParameter> list, out int rowCount)
{
rowCount = 0;
SqlConnection connection = new SqlConnection(connectionString);
SqlParameter[] parameters = {
new SqlParameter("@TableNames",SqlDbType.VarChar,200),
new SqlParameter("@PrimaryKey",SqlDbType.VarChar,100),
new SqlParameter("@Fields",SqlDbType.VarChar,200),
new SqlParameter("@PageSize",SqlDbType.Int,4),
new SqlParameter("@CurrentPage",SqlDbType.Int,4),
new SqlParameter("@Filter",SqlDbType.VarChar,200),
new SqlParameter("@Group",SqlDbType.VarChar,200),
new SqlParameter("@Order",SqlDbType.VarChar,200),
new SqlParameter("@RecordCount",SqlDbType.Int,4)
};//参数列表
parameters[0].Value = tableName;
parameters[1].Value = iDName;
parameters[2].Value = Fields;
parameters[3].Value = pageSize;
parameters[4].Value = currentPage;
parameters[5].Value = Filter;
parameters[6].Value = Group;
parameters[7].Value = Order;//参数对应值
parameters[8].Value = rowCount;
parameters[8].Direction = ParameterDirection.Output;
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = "usp_PagingLarge";//存储过程名
cmd.CommandType = CommandType.StoredProcedure;//类型
cmd.Parameters.AddRange(parameters);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
connection.Close();
rowCount = Convert.ToInt32(parameters[8].Value);//输出
return dt;
}
(3)调用多表分页的方法
public string GetFenye(out int recordcount, NameValueCollection form,string loginid,int flag) {
QueryModel queryMdodel = QueryModel.getQueryModel(form);
string tablename = "Email_MailSender left join Email_MailInfo on Email_MailSender.mailid=Email_MailInfo.Mailid ";
string iDName = "Email_MailSender.mailsenderid";
string Fields = "Email_MailSender.*,Email_MailInfo.mailtopic,Email_MailInfo.sendtime";
int PageSize = queryMdodel.rows;
int PageIndex = queryMdodel.page == 0 ? 0 : queryMdodel.page - 1;
string Filter = "Email_MailSender.senderid = '" + loginid + "' and Email_MailSender.sendstatus ="+flag;
string group = "";
string order = "Email_MailSender.mailsenderid asc";
DataTable dt = DbHelperSQL.ExecMultiPageList(tablename, iDName, Fields, PageSize, PageIndex, Filter, group, order,queryMdodel.listPar ,out recordcount);
string strjson = Newtonsoft.Json.JsonConvert.SerializeObject(dt); return strjson;
}
posted on 2013-10-13 23:05 huakaiyueluo 阅读(443) 评论(0) 编辑 收藏 举报