您的当前位置:首页正文

另类SQL拼接方法

2023-10-01 来源:客趣旅游网
在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的地方就是不能对SQL进行参数化处理。下面介绍一种就算基于String +的方式也可以进行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) { MatchCollectionmatchs = 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; } 这样一个基于拼接的SQL参数化处理就完成了,以上紧紧是想表达一下运算符重载所带来的效果,对于这种方式编写参数化SQL是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。

因篇幅问题不能全部显示,请点此查看更多更全内容