博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
另类SQL拼接方法
阅读量:6432 次
发布时间:2019-06-23

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

在编写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是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。

转载地址:http://mixga.baihongyu.com/

你可能感兴趣的文章
实现开启和关闭android移动网络(转)
查看>>
【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
查看>>
第12届北师大校赛热身赛第二场 C. 组合数
查看>>
spin_lock & mutex_lock的差别?
查看>>
Java-hibernate的映射文件
查看>>
【原】使用Json作为Python和C#混合编程时对象转换的中间文件
查看>>
适配iPhone6和iPhone6 Plus
查看>>
深入探讨this指针
查看>>
ExtJs自学教程(1):一切从API開始
查看>>
Nginx+keepalived做双机热备加tomcat负载均衡
查看>>
myeclipse 配置
查看>>
由七芒星引出来的——关于142857
查看>>
与其说我害怕成为普通人,还不如说我害怕生活,害怕找不到一种自己喜欢的方式去度过人生...
查看>>
制作iis自动安装包
查看>>
关于控制台程序下使用mfc库中的函数时断言
查看>>
Handling events in an MVVM WPF application
查看>>
在Ubuntu上下载、编译和安装Android最新源代码
查看>>
[转]JavaScriptSerializer中日期序列化
查看>>
SecurityError Error 2148 SWF 不能访问本地资源
查看>>
html5各种页面切换效果和模态对话框
查看>>