另类SQL拼接方法
在编写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)
{
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;
}
|
这样一个基于拼接的SQL参数化处理就完成了,以上紧紧是想表达一下运算符重载所带来的效果,对于这种方式编写参数化SQL是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。
可靠、高性能的Socket TCP通讯组件
开源数据库访问组件
开源多台平通讯组件
c#组件设计交流群:47164588
c# socket :136485198 微博http://weibo.com/ikende
开源数据库访问组件
开源多台平通讯组件
c#组件设计交流群:47164588
c# socket :136485198 微博http://weibo.com/ikende