zoukankan      html  css  js  c++  java
  • 借用.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

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

  • 相关阅读:
    NPM下载模块包说明
    Keycode对照表
    iframe的document操作
    JS中鼠标左右键以及中键的事件
    BOM函数之history对象
    31、开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理: 1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并) 2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并) 3.输入的文件可能带路径,记录文
    30、最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
    二叉树遍历的算法
    28、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
    27、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
  • 原文地址:https://www.cnblogs.com/jintan/p/1299807.html
Copyright © 2011-2022 走看看