使用这种通用的存储过程进行分页查询,想要防SQL注入,只能对输入的参数进行过滤,例如将一个单引号“'”转换成两个单引号“''”,但这种做法是不安全的,厉害的黑客可以通过编码的方式绕过单引号的过滤,要想有效防SQL注入,只有参数化查询才是最终的解决方案。但问题就出在这种通用分页存储过程是在存储过程内部进行SQL语句拼接,根本无法修改为参数化的查询语句,因此这种通用分页存储过程是不可取的。但是如果不用通用的分页存储过程,则意味着必须为每个具体的分页查询写一个分页存储过程,这会增加不少的工作量。
经过几天的时间考虑之后,想到了一个用代码来生成参数化的通用分页查询语句的解决方案。代码如下:
复制代码 代码如下:
public class PagerQuery
{
private int _pageIndex;
private int _pageSize = 20;
private string _pk;
private string _fromClause;
private string _groupClause;
private string _selectClause;
private string _sortClause;
private StringBuilder _whereClause;
public DateTime DateFilter = DateTime.MinValue;
protected QueryBase()
{
_whereClause = new StringBuilder();
}
/**//// <summary>
/// 主键
/// </summary>
public string PK
{
get { return _pk; }
set { _pk = value; }
}
public string SelectClause
{
get { return _selectClause; }
set { _selectClause = value; }
}
public string FromClause
{
get { return _fromClause; }
set { _fromClause = value; }
}
public StringBuilder WhereClause
{
get { return _whereClause; }
set { _whereClause = value; }
}
public string GroupClause
{
get { return _groupClause; }
set { _groupClause = value; }
}
public string SortClause
{
get { return _sortClause; }
set { _sortClause = value; }
}
/**//// <summary>
/// 当前页数
/// </summary>
public int PageIndex
{
get { return _pageIndex; }
set { _pageIndex = value; }
}
/**//// <summary>
/// 分页大小
/// </summary>
public int PageSize
{
get { return _pageSize; }
set { _pageSize = value; }
}
/**//// <summary>
/// 生成缓存Key
/// </summary>
/// <returns></returns>
public override string GetCacheKey()
{
const string keyFormat = "Pager-SC:{0}-FC:{1}-WC:{2}-GC:{3}-SC:{4}";
return string.Format(keyFormat, SelectClause, FromClause, WhereClause, GroupClause, SortClause);
}
/**//// <summary>
/// 生成查询记录总数的SQL语句
/// </summary>
/// <returns></returns>
public string GenerateCountSql()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
return string.Format("Select count(0) {0}", sb);
}
/**//// <summary>
/// 生成分页查询语句,包含记录总数
/// </summary>
/// <returns></returns>
public string GenerateSqlIncludeTotalRecords()
{
StringBuilder sb = new StringBuilder();
if (string.IsNullOrEmpty(SelectClause))
SelectClause = "*";
if (string.IsNullOrEmpty(SortClause))
SortClause = PK;
int start_row_num = (PageIndex - 1)*PageSize + 1;
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
string countSql = string.Format("Select count(0) {0};", sb);
string tempSql =
string.Format(
"WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,{1}{2}) Select * from t where row_number BETWEEN {3} and {4};",
SortClause, SelectClause, sb, start_row_num, (start_row_num + PageSize - 1));
return tempSql + countSql;
}
/**//// <summary>
/// 生成分页查询语句
/// </summary>
/// <returns></returns>
public override string GenerateSql()
{
StringBuilder sb = new StringBuilder();
if (string.IsNullOrEmpty(SelectClause))
SelectClause = "*";
if (string.IsNullOrEmpty(SortClause))
SortClause = PK;
int start_row_num = (PageIndex - 1)*PageSize + 1;
sb.AppendFormat(" from {0}", FromClause);
if (WhereClause.Length > 0)
sb.AppendFormat(" where 1=1 {0}", WhereClause);
if (!string.IsNullOrEmpty(GroupClause))
sb.AppendFormat(" group by {0}", GroupClause);
return
string.Format(
"WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,{1}{2}) Select * from t where row_number BETWEEN {3} and {4}",
SortClause, SelectClause, sb, start_row_num, (start_row_num + PageSize - 1));
}
}
使用方法:
复制代码 代码如下:
PagerQuery query = new PagerQuery();
query.PageIndex = 1;
query.PageSize = 20;
query.PK = "ID";
query.SelectClause = "*";
query.FromClause = "TestTable";
query.SortClause = "ID DESC";
if (!string.IsNullOrEmpty(code))
{
query.WhereClause.Append(" and ID= @ID");
}
a) GenerateCountSql ()方法生成的语句为:
Select count(0) from TestTable Where 1=1 and ID= @ID
b) GenerateSql()方法生成的语句为:
WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY ECID DESC) as row_number, * from TestTable where 1=1 and ID= @ID) Select * from t where row_number BETWEEN 1 and 20
c) GenerateSqlIncludetTotalRecords()方法生成的语句为:
WITH t AS (SELECT ROW_NUMBER() OVER(ORDER BY E.ECID DESC) as row_number,* from TestTable where 1=1 and ID= @ID) Select * from t where row_number BETWEEN 1 and 20;Select count(0) from ECBasicInfo where 1=1 and ID= @ID;
注意:以上代码生成的SQL语句是曾对SQL SERVER 2005以上版本的,希望这些代码对大家有用
相关推荐:
SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名
seo适合什么职业,seo有前途么 ,ai小精灵
GoogleGTP-智能时代的革命性突破,人工智能的新纪元,ai可以降论文ai率吗
ChatGPT页面无法下拉?禁用浏览器扩展,轻松解决!,imba 1.6 ai
ChatGPT手机下载后打不开?可能是这些问题导致的,解决方法在这里!,孤城ai动画
ChatGPT破解:人工智能未来的无限可能,污污AI解说
AI免费生成文章的软件:轻松创作的秘密武器
ChatGPT:OpenAI的创新之作-一款颠覆传统的语言模型,ai球衣号
智能AI生成文章释放创作新可能
AI文章比对技术:引领写作与内容审核的新革命,ai智能写作小说免费
SEO挣钱之道:如何通过SEO实现网络盈利,宁晋网站建设商家
SEO利用:让你的网站快速登顶,获取更多流量与客户!,延边小程序推广平台网站
自动AI写文章:轻松创作时代的全新利器
人工润色:让文字更具魅力的秘密武器,快排seo软件哪个最好
WP原创:打造属于你的独特网站,从这里开始!,一个网站推广一个月需要多少钱
自动写文章的AI,提升效率的创作利器
英语日记AI生成:轻松提升英语水平的智能助手
SEO售产-数字营销新战场,助力企业实现盈利增长,去哪找自贡网站建设
seo需要什么能力,seo需要哪些技术 ,ai长条弯曲
优化标题:如何让你的文章更具吸引力与点击力,整站网站优化解决方案
SEO优化中怎么找关键词:全面解析与实战技巧,ai2002.4.8
ChatGPT内部HTTP接口文档-为开发者提供高效便捷的AI服务接入方式,安屿ai
怎么分辨文章是不是AI写的?五大技巧揭开真相
互联网快照:记录数字时代的每个瞬间,全网seo怎么优化内容
SEO要求:如何优化网站提升搜索引擎排名,助力企业获取更多流量,鹤山区网站运营推广
SEM+SEO:助力企业数字化营销的双剑合璧之道,ai头像丑
什么是seo反连接,网站反链多好还是少好 ,网易ai产品
SEO优化基础:让你的网站脱颖而出的秘密武器,模仿猫ai
AI网页设计生成-智能化创造无限可能,ai机甲风背景音乐
SEO北京:数字时代,企业成功的关键,湖南网站建设湖南岚鸿
SEO基础知识解析:如何提升网站排名,助力企业成长,毕节企业建设网站
SEO模板:提升网站排名,助你快速抢占搜索引擎流量高地,选择seo职业缺点
“标题制造机”:颠覆内容创作的秘密武器,助你轻松打造吸引力十足的标题,景区线上推广用哪些网站
代哥SEO-让您的网站迅速登顶搜索引擎的秘密武器,济南关键词的排名优化
OpenPose大白话解释:让你轻松理解姿态识别的神奇技术,ai天天晴
SEO作用:提升网站流量与品牌曝光的秘密武器,美容网站联盟平台推广
AI上的文章属于原创吗?人工智能创作内容的归属问题
为什么要年前做SEO,企业为什么做seo推广 ,云南ai大数据公司
SEO对策:提升网站排名与流量的必备策略,SEO入门相机平价学生
好用的AI写作软件,让创作更高效
ChatGPT故障:科技背后的秘密与应对策略,华为什么手机带ai功能
AI一键生成文章网页版,让内容创作更简单高效
二级泛站群,zblog二级泛站群 ,李宗盛ai
seo链接有什么用,seo外链是什么意思 ,one ai写作
ChatGPT网页版内容显示不全的原因与解决方案,ai超级绘
SEO技术如何通过优化提升网站流量与排名,四平网站优化公司
SEO做网站点击:提升网站流量的关键策略,国内ai写作论文
AI助手不需要登陆-畅享便捷生活,随时随地高效工作,ai客服 对话
互联网留痕:数字时代的隐形轨迹与自我管理,灯塔网站推广包年多少钱
ChatGPT与讯飞:AI语音与智能对话的完美融合,ai直角变圆角