在项目中使用SQL动态配置的方式可以让后期的维护和发布后的修改变得更加方便,无论使用那种配置方式都离不开解析成最终真正能执行的SQL。
下面代码就是一种比较简单的处理方法,SQL的参数以##括起来。

1.在代码中先建立一个需要解析的SQL,后面需要变成配置方式

  1. /// <summary>
  2. /// 暂时用于测试
  3. /// </summary>
  4. static string _sql = "SELECT * FROM TB_USER WHERE ID = #ID# AND NAME LIKE '%#NAME#%'";

2.建立一个根据参数KEY去解析的方法,一般情况下都是使用此方法

  1. /// <summary>
  2. /// 根据SQL和参数集合解析成需要执行的SQL
  3. /// </summary>
  4. /// <param name="str"></param>
  5. /// <param name="dic"></param>
  6. /// <returns></returns>
  7. public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
  8. {
  9. str = str.ToUpper();
  10. foreach (var item in dic)
  11. {
  12. str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
  13. }
  14. return str;
  15. }

3.建立一个根据顺序解析的方法,不推荐使用此方法

  1. /// <summary>
  2. /// 根据SQL和参数集合解析成需要执行的SQL
  3. /// </summary>
  4. /// <param name="str"></param>
  5. /// <param name="list"></param>
  6. /// <returns></returns>
  7. public static string AnalyticalByList(string str, List<string> list)
  8. {
  9. str = str.ToUpper();
  10. List<string> sqlList = new List<string>();
  11. var sqlstr = str;
  12. int i = ;
  13. int j = ;
  14. int sum = ;
  15. while (true)
  16. {
  17. i = str.Substring(sum, str.Length - sum).IndexOf('#') + ;
  18. sum += i;
  19. j = str.Substring(sum, str.Length - sum).IndexOf('#');
  20. if (i < || j < )
  21. {
  22. break;
  23. }
  24. sqlList.Add(str.Substring(sum, j));
  25. sum += j + ;
  26. }
  27. for (int index = ; index < sqlList.Count && index < list.Count; index++)
  28. {
  29. str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
  30. }
  31. return str;
  32. }

4.方法建好了,就试一下DEMO看看效果,直接在Main里面调用就好

  1. static void Main(string[] args)
  2. {
  3. Dictionary<string, string> dic = new Dictionary<string, string>();
  4. dic.Add("ID", "");
  5. dic.Add("Name", "jimmy.pan");
  6. string sql = _sql;
  7. Console.WriteLine(AnalyticalByDic(sql, dic));
  8. List<string> list = new List<string>();
  9. list.Add("");
  10. list.Add("jimmy");
  11. sql = _sql;
  12. Console.WriteLine(AnalyticalByList(sql, list));
  13. Console.Read();
  14. }

5.运行结果如下图

6.整体代码

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace SQLAnalytical
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. Dictionary<string, string> dic = new Dictionary<string, string>();
  11. dic.Add("ID", "");
  12. dic.Add("Name", "jimmy.pan");
  13. string sql = _sql;
  14. Console.WriteLine(AnalyticalByDic(sql, dic));
  15. List<string> list = new List<string>();
  16. list.Add("");
  17. list.Add("jimmy");
  18. sql = _sql;
  19. Console.WriteLine(AnalyticalByList(sql, list));
  20. Console.Read();
  21. }
  22.  
  23. /// <summary>
  24. /// 根据SQL和参数集合解析成需要执行的SQL
  25. /// </summary>
  26. /// <param name="str"></param>
  27. /// <param name="dic"></param>
  28. /// <returns></returns>
  29. public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
  30. {
  31. str = str.ToUpper();
  32. foreach (var item in dic)
  33. {
  34. str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
  35. }
  36. return str;
  37. }
  38.  
  39. /// <summary>
  40. /// 根据SQL和参数集合解析成需要执行的SQL
  41. /// </summary>
  42. /// <param name="str"></param>
  43. /// <param name="list"></param>
  44. /// <returns></returns>
  45. public static string AnalyticalByList(string str, List<string> list)
  46. {
  47. str = str.ToUpper();
  48. List<string> sqlList = new List<string>();
  49. var sqlstr = str;
  50. int i = ;
  51. int j = ;
  52. int sum = ;
  53. while (true)
  54. {
  55. i = str.Substring(sum, str.Length - sum).IndexOf('#') + ;
  56. sum += i;
  57. j = str.Substring(sum, str.Length - sum).IndexOf('#');
  58. if (i < || j < )
  59. {
  60. break;
  61. }
  62. sqlList.Add(str.Substring(sum, j));
  63. sum += j + ;
  64. }
  65. for (int index = ; index < sqlList.Count && index < list.Count; index++)
  66. {
  67. str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
  68. }
  69. return str;
  70. }
  71.  
  72. /// <summary>
  73. /// 暂时用于测试
  74. /// </summary>
  75. static string _sql = "SELECT * FROM TB_USER WHERE ID = #ID# AND NAME LIKE '%#NAME#%'";
  76.  
  77. }
  78. }

SQL动态配置,动态解析SQL的更多相关文章

  1. Delphi动态配置ODBC数据源--SQL Server版本

    (摘自)http://jxlearnew.blog.163.com/blog/static/549786592007102451431413/ 这里介绍一种用Delphi来实现动态注册的方法,希望对各 ...

  2. 使用不同模板引擎beetl、FreeMarker、Velocity动态解析sql的方法

    1. String sql = null;if(null == renderType || renderType.equals(ConstantRender.sql_renderType_beetl) ...

  3. MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接 ...

  4. 学习动态性能表 v$sql

    学习动态性能表 第三篇-(1)-v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存 ...

  5. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  6. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  7. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  8. .NET在EF中使用sql,用动态类吧!

    .NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...

  9. PL/SQL开发中动态SQL的使用方法

    一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使 ...

随机推荐

  1. 复制构造函数被调用的三种情况------新标准c++程序设计

    1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...

  2. 《C#多线程编程实战》2.8 Barrier

    不得不说,C#的同步线程的机制是真的多. 各式各样.几乎各种场景下都有可以使用的同步机制. 今天说的,就是比较有意思了. 等待的机制很简单,单纯的等待. 使用的方法我就等. 等待的东西或者内容则是你自 ...

  3. python-判断语句介绍

    1.生活中的判断场景 1.1 火车站安检 1.2 上网吧 2.开发中的判断场景 2.1 密码判断 2.2 重要日期判断 if 今天是周六或者周日: 约妹子 if 今天是情人节: 买玫瑰 if 今天发工 ...

  4. NSSet集合

    前言 NSSet:集合 NSSet 集合跟数组差不多,但 Set 集合不能存放相同的对象,它是一组单值对象的集合,被存放进集合中的数据是无序的,它可以是可变的,也可以是不变的. Xcode 7 对系统 ...

  5. rsync入门

    rsync是Linux/unix下一个用于远程文件(目录)同步的一个精巧的小工具程序,有很多文章讨论了其功能和实现原理,本文主要就不赘述了. 主要介绍下实践时使用的一些方法和细枝末节留作工作笔记以便日 ...

  6. JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

    套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...

  7. [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法

    最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...

  8. 导出table为Excel

    1.HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...

  9. 转载---<html>与<body>

    关于根元素html以及body的对比,主要是遇到设置背景色的问题,这里转载张鑫旭的关于html和body对比的文.(直接贴过来,是为了以后自己方便看) 原文地址:http://www.zhangxin ...

  10. python学习之路---day05

    字典一:基本组成 dic={"",[],{},"",2,} 字典由key 和value组成, key(键):键是不可变的(且必须要不可改变),一个字典中的key ...