博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
根据EntityFramework写的重写sql语句的类
阅读量:5735 次
发布时间:2019-06-18

本文共 3505 字,大约阅读时间需要 11 分钟。

代码如下

View Code
1 class ReSql { 2         #region 防sql注入重写sql语句//出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 3         public string RewriteSql(string sql) { 4             sql = Regex.Replace(sql, @"\s+", " "); 5             string[] sqlArr = sql.Replace("where", "拆").Split('拆'); 6             string newsql = ""; 7             for (int i = 0; i < sqlArr.Length; i++) { 8                 if (i > 0) { 9                     string item = "where" + sqlArr[i];10                     sqlArr[i] = item;11                 }//出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 12                 if (i < sqlArr.Length - 1) {13                     newsql += sqlArr[i];14                 }15             }16             if (!string.IsNullOrWhiteSpace(newsql)) {17                 sql = newsql.Replace("'", "''");18             }19 20             string where = "";21             if (sqlArr.Length > 1) {22                 where = sqlArr[sqlArr.Length - 1];23 24                 //过滤and25                 where = RegexReplacewithEvaluator(where);26 27                 string regexStr = @"(?<==)\s*[^\w*\.]\w*[^\)]|(?<=like)\s*\W*\w*\W*\s*";//出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 28                 //原来的,不够优化//(?<==)\s*\w*[^\.|^\)]\s*|(?<==)\s*\W\w*\W\s*|(?<==)\s*\w*\s*|(?<=like)\s*\W*\w*\W*\s*29                 MatchEvaluator evaluator = new MatchEvaluator(ReplaceMatchEvaluator);30                 where = Regex.Replace(where, regexStr, evaluator).Replace("'", "''");31 32 33                 sql = "exec sp_executesql N'" + sql + where + "'";34 35                 string paramsType = "";36                 string paramsKey = "";37                 string paramsValue = "";38                 foreach (KeyValuePair
item in strDic) {39 paramsType = ",N'";40 paramsKey += "@" + item.Key + " nvarchar(max),";41 42 paramsValue += ",@" + item.Key + "=" + item.Value;43 }44 if (!string.IsNullOrWhiteSpace(paramsKey)) {45 sql += paramsType + paramsKey.Substring(0, paramsKey.Length - 1) + "'";46 sql += paramsValue;47 }48 //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 49 sql = Regex.Replace(sql, "过滤项", 过滤项);50 }51 return sql;52 }53 Dictionary
strDic = new Dictionary
();54 private string ReplaceMatchEvaluator(Match m) {55 string guid = Guid.NewGuid().ToString("N");56 strDic.Add(guid, m.Value);57 return " @" + guid + " ";58 //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 59 }60 61 private string RegexReplacewithEvaluator(string where) {62 string regexStr = @"and\s{1}\(.*\)";63 MatchEvaluator evaluator = new MatchEvaluator(Replace过滤项);64 return Regex.Replace(where, regexStr, evaluator);65 }66 private string 过滤项 = "";67 private string Replace过滤项(Match m) {68 过滤项 = m.Value.Replace("'", "''");69 return "过滤项";70 //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 71 }72 73 #endregion74 }

 使用方法

ReSql resql = new ReSql();sql = resql.RewriteSql(tsql);

//出自http://www.cnblogs.com/ahjesus

尊重作者辛苦劳动成果,转载请注明出处,谢谢!

转载于:https://www.cnblogs.com/ahjesus/archive/2012/11/27/2790631.html

你可能感兴趣的文章
[Python]网络爬虫(六):一个简单的百度贴吧的小爬虫(转)
查看>>
总结了关于PHP xss 和 SQL 注入的问题(转)
查看>>
(5.1~5.7)
查看>>
给出2个数和一个运算符号,用函数求结果
查看>>
dev accordionControl panelcontorl 使用
查看>>
CORBA简介
查看>>
Silverlight程序之修改命名空间
查看>>
Huffman树与最优二叉树续
查看>>
Python 日历模块calendar.monthrange 获取某一个月有多少天
查看>>
TP条件查询和分页查询
查看>>
文件加密二进制版本
查看>>
Hibernate入门(七)一对多入门案例
查看>>
我不想为了成全别人而活
查看>>
Catalog
查看>>
驱动学习笔记(零)一篇简单makefile的学习
查看>>
编写灵活、可扩展程序的步骤与方法(学院派)
查看>>
Python 之 模块
查看>>
MOSS2007备份还原后搜索服务出现的问题
查看>>
Oracle删除一个库里面的所有表
查看>>
spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
查看>>