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;
}
sqlserver 存储过程学习笔记(二) 在项目中的应用<多表分页>的更多相关文章
- sqlserver存储过程学习笔记(一)基础知识篇(全)
说出来有点丢人,做sqlserver应用系统近一年,竟然没有使用过存储过程,现在就好好的梳理一下对应知识,慢慢让其加入到我的项目中去吧. 存储过程的优点:1.运行效率高,提供了在服务器端快速执行sql ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- django学习笔记二:一个项目多个App项目搭建
django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...
- Cocos2dx 学习笔记整理----在项目中使用图片(三)
这节练习下DragonBones. 手机由于性能所限,需要特注意资源的使用. 游戏项目的话由于资源比较多,一般都会用到DragonBones来做动作,这个又称为龙骨. DragonBones传送点:h ...
- Cocos2dx 学习笔记整理----在项目中使用图片(一)
cocos2dx有多种使用图片的方法,先来个最简单的:用CCSprite直接使用图片. 首先,进入到之前建立的项目,把你将要使用的图片放入到目录下的Resources文件夹里面.项目中以相对路径使用资 ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- Cocos2dx 学习笔记整理----在项目中使用图片(二)
之前了解了一种比较简单的图片的使用方式, 今次来了解稍微复杂一点的图片使用方式,plist+png. 这里要用到之前提到的Texture Packer. Texture Packer是一款图片打包工具 ...
- Android Studio安卓学习笔记(二)Android项目结构
上一篇代码,我们学习了Android的功能以及如何用Android Studio开发第一个安卓程序.下面就要介绍Android项目结构.为日后学习打基础. 一:Android项目结构 打开MyFris ...
- PMBOK学习笔记二-项目管理过程
项目管理过程可归纳为五类,即五大项目管理过程组 启动过程组.定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程..规划过程组.明确项目范围,优化目标,为实现目标制定行动方案的一组过程 ...
随机推荐
- DP之花店橱窗布置
题目:https://www.smartoj.com/p/1286 分析:花瓶是有序的,花也是有序的,这就保证了有序性,从而满足子解的全局最优,和无后效性.假设dp[i][j]表示前i 朵花,放在前j ...
- 【译】在ASP.NET中创建PDF-iTextSharp起步
原文 [译]在ASP.NET中创建PDF-iTextSharp起步 .Net framework 中自身并不包含可以和pdf打交道的方法.所以,当你需要你的ASP.Net Web应用程序中包含创建或与 ...
- hdu4710
Balls Rearrangement Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- USACO 2005 January Gold The Wedding Juicer
题目 题目链接,我只在poj上找到了题目,usaco居然上不去. 大意就是说有一些\(1\times 1\times 1\)的小方块堆在一起,问最多能装多少水. 我们在一次测试中出了这题,由于我写水题 ...
- Linux笔记——linux下的语音合成系统
1.festival 安装:sudo apt-get install festival 使用: (SayText "Hello!") 2. espeek(ubuntu 自带) # ...
- c++,为什么要引入虚拟继承
虚拟基类是为解决多重继承而出现的. 以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { i ...
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
原文:WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘 通过<再谈IIS与ASP.NET管道>的介绍,相信读者已经对IIS和ASP.NET的请求处理管道有了一个大致 ...
- COCOS2D-X之圆形进度条的一个简单Demo
这应该是游戏中很常见的一个效果.显示某个事件的进度等,在加载资源或者联网的时候经常用到.所以有必要学习学习 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添 ...
- CxSkinButton按钮皮肤类
在codeproject 发现一个很强大的按钮皮肤类,之前的版本有内存泄露,但是作者已经修复了,原文网址是:http://www.codeproject.com/KB/buttons/cxskinbu ...
- atitit.集filt经营分部 filter总结
atitit.集filt经营分部 filter总结 1. Css sltr 1 2. 基本选择器(依据id,class,元素名) 2 3. 层次选择器 3 4. 过滤选择器 3 5. First,la ...