在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的地方就是不能对SQL进行参数化处理。下面介绍一种就算基于String +的方式也可以进行SQL参数处理。

常见的SQL拼接

id =3;
"select * from orders where employeeid="+id;

这样存在的问题是相当明显的就是SQL注入,如果需要参数化那在编写代码的时候就相对多了些工作。下面介绍通过以上的编写方式自动实现参数化功能。

自动参数化处理

id=3;
SQL sql="select * from orders where empoyeeid=@id";
sql = sql +id;

更多实际应用效果

            string city = "sdf";
SQL sql = "select * from orders where employeeid=@i";
sql = sql + 3;
Output(sql);
sql = "select * from order where employeeid in(@p1,@p2)";
sql = sql + 3 + 4;
Output(sql);
sql = "select * from orders where 1=1";
if (city != null)
sql = sql+" and city=@p1" + city;
Output(sql);

最终处理参数化的结果是:

SQL:select * from orders where employeeid=@i
Name:@i=3
-------------------------------------------
SQL:select * from order where employeeid in(@p1,@p2)
Name:@p1=3
Name:@p2=4
-------------------------------------------
SQL:select * from orders where 1=1 and city=@p1
Name:@p1=sdf
-------------------------------------------

实现

为了达到以上处理效果针对性实现了一个SQL对象,通过运算符的重载把+运算修改一下。在处理的过程需要对SQL语句和值的处理,首先当一个SQL String进桟的时候先分析一下这个String是否包括参数,如果包括就把参数压到队列中,大概代码如下:

private void MatchSql(string sql)
{
MatchCollection matchs = Regex.Matches(sql, "@[a-zA-Z0-9]+");
if (matchs.Count > 0)
{
foreach (Match item in matchs)
{
mInputParameters.Enqueue(item.Value);
}
}
}

简单地一个正则匹配就OK了,把找到的参数压队列中。有了这个依据那在向SQL对象再次压入值的时候就可以判断参数队列是否有参数,如果有就压到SQL参数集里面,没有就拼接到SQL语句中。

public static SQL operator +(SQL sql, ValueType value)
{ if (sql.mInputParameters.Count > 0)
{
sql.Parameter(sql.mInputParameters.Dequeue(), value);
} return sql;
}
public static SQL operator +(SQL sql, string subsql)
{ if (sql.mInputParameters.Count > 0)
{
sql.Parameter(sql.mInputParameters.Dequeue(), subsql);
}
else
sql.AddSql(subsql); return sql;
}

这样一个基于拼接的SQL参数化处理就完成了,以上紧紧是想表达一下运算符重载所带来的效果,对于这种方式编写参数化SQL是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。

另类SQL拼接方法的更多相关文章

  1. SQL拼接方法

    smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 另类SQL拼接方法 在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的 ...

  2. 多条件分页查找(SQL拼接方法)

    def startTime=params.startTime+" 00:00:00"  def endTime=params.endTime + " 23:59:59&q ...

  3. 自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  4. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  5. Mybatis笔记 - SQL标签方法

    Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...

  6. Mybatis总结一之SQL标签方法

    ---恢复内容开始--- 定义:mapper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. ...

  7. 巧用SQL拼接语句

    前言: 在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果.本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索 ...

  8. PL/SQL异常处理方法

    PL/SQL异常处理方法   1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...

  9. SQL 跟踪方法相关介绍

    oracle sql跟踪方法:1.sql_trace打开跟踪:alter session set sql_trace=true;为跟踪文件做标记:alter session set tracefile ...

随机推荐

  1. WCF调错方法

    1.在VS cmd里,输入wcftestclient.exe 2.添加Service服务. 3.点击要测试的方法,输入参数,点击Invoke. 4.如果错误信息很模糊,则修改WCF程序所在的Web.c ...

  2. 微信浏览器里在底部的输入框,ios11的不会被遮盖、10.1会被盖住

    /** * 由于ios10 和 ios11 版本之间的差异,所以先判断ios系统版本之后再做处理 */ let str = navigator.userAgent.toLowerCase(); let ...

  3. 很漂亮的PHP验证码(记录)

    在提交表单的时候为了防止机器操作或者是恶意的攻击,在填写表单的时候一般都用验证码来过滤掉一些非法提交数据.今天给大家介绍一款超实用超漂亮的PHP验证码库:Captcha. 安装 使用composer: ...

  4. js基础知识:字面量 关键字和保留字

    js中的字面量概念我的理解就是:字体表面的常量 如:数字 100, 字符串  "ssss"或'ssss'  布尔值:false ,正则 以及null对象. 这些都是常量. 关键字: ...

  5. Linux 入门视频教程

    http://v.youku.com/v_show/id_XNzM4NTU0MjQ4.html?f=28697585&o=1 1.1.1 Linux系统简介-UNIX发展历史和发行版本http ...

  6. shell脚本颜色输出(实例未编辑)

    颜色输出通过echo 输出,需要加-e echo -e "\033[背景颜色;字体颜色\033[0m" 背景颜色 40 设置黑色背景 41 设置红色背景 42 设置绿色背景 43 ...

  7. 基础项目构建,引入web模块,完成一个简单的RESTful API 转载来自翟永超

    简介 在您第一次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复粘贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...

  8. C# WebAPI系列(2)

    上篇中简单介绍了一下WebApi,本章主要介绍一下Controller相关的知识. 在实际应用中,Controller是WebAPI的链接服务器和客户端的窗口.Controller的好坏影响整个系统的 ...

  9. XML学习总结一

    1.声明 <?xml version="1.0"  encoding="gb2312"?> version属性指定该文档遵守的版本号,通常为1.0X ...

  10. 恢复oracle数据从delete

    今天维护系统的时候没仔细看,误删了50行数据,然后想起来以前学过delete语句删除的数据是可以回复的,但是那个时候比较慌乱,也没有心情仔细看,反而是想到了一个歪招解决了问题,我有个良好的嗜好就是经常 ...