SQL拼接

常见的SQL拼接
1
2
id =3;
"select * from orders where employeeid=" +id;

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

自动参数化处理
1
2
3
id=3;
SQL sql= "select * from orders where empoyeeid=@id" ;
sql = sql +id;
更多实际应用效果
1
2
3
4
5
6
7
8
9
10
11
             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);

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

1
2
3
4
5
6
7
8
9
10
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是否包括参数,如果包括就把参数压到队列中,大概代码如下:

1
2
3
4
5
6
7
8
9
10
11
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语句中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
    }

转载于:https://my.oschina.net/u/3015045/blog/810830

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值