借用.net framework的string.Fromat(...),实现一个执行参数化SQL的方法

1. 目的

          最近在做一个SQL操作类,大部分都是对SQLHelper做一下封装,最后希望实现一个可以执行参数化SQL的方法,SQL语句中允许像string.Format(formatStr,args)中的formatStr一样,用{0}{1}...作为参数格式,而实际将被转换为SQL参数化的格式,而SQL参数的值parameterValues最终将会被转换为合适类型的SqlParameter[]数组。

原型如下:

 

 1         public object SqlScalar(string commandText, params object[] parameterValues)
 2         {
 3             if (commandText == null || commandText.Length == 0throw new ArgumentNullException("commandText");
 4             SqlCommand cmd = GetCommand(commandText);
 5             if ((parameterValues != null&& (parameterValues.Length > 0))
 6             {
 7                 SQlParameterFormatter formatter = new SQlParameterFormatter();
 8                 formatter.Format(commandText, parameterValues);
 9                 return ExecuteScalar(CommandType.Text, formatter.Sql, formatter.Parameters);
10             }
11             else
12             {
13                 return ExecuteScalar(CommandType.Text, commandText, (SqlParameter[])null);
14             }
15             
16         }

   

调用时:

object result = SqlScalar("select Fid from students where name={0and age={1}", "靳同学", 20);

 

而最终sql语句被转换为:

select Fid from students where name=@arg__0 and age=@arg__1

这样有个好处就是,可以避免SQL注入,而代码也很简洁。

 

2. 实现

     上面的SqlScalar方法中第7行,有一个重要的SQlParameterFormatter类,有两个属性:

public string Sql,public SqlParameter[] Parameters。这个个类负责格式化传入的复合参数的sql和值,处理后并赋值给属性SQL和Parameters

最初被想写一个正则表达式实现,突然想到string.Format(),的确很像,既然MS已经公布.net framework的源码,为何不借用一下呢?调出源码来看,还真不少。实际上string.Format()是调用了StringBuilder的AppendFormat()方法,来看看StringBuilder类的AppendFormat()

Code

 

可以看出,这样处理效率还是蛮高的。

 

下面是我借用AppendFormat处理参数的方式来实现的SQlParameterFormatter类

Code

 

 

只是一个想法而已,没有用在实际项目中, 欢迎大家拍砖

posted @ 2008-09-26 20:30  代码乱了  阅读(3337)  评论(28编辑  收藏  举报