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

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

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

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

/// <summary>
/// 根据SQL和参数集合解析成需要执行的SQL
/// </summary>
/// <param name="str"></param>
/// <param name="dic"></param>
/// <returns></returns>
public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
{
str = str.ToUpper();
foreach (var item in dic)
{
str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
}
return str;
}

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

/// <summary>
/// 根据SQL和参数集合解析成需要执行的SQL
/// </summary>
/// <param name="str"></param>
/// <param name="list"></param>
/// <returns></returns>
public static string AnalyticalByList(string str, List<string> list)
{
str = str.ToUpper();
List<string> sqlList = new List<string>();
var sqlstr = str;
int i = ;
int j = ;
int sum = ;
while (true)
{
i = str.Substring(sum, str.Length - sum).IndexOf('#') + ;
sum += i;
j = str.Substring(sum, str.Length - sum).IndexOf('#');
if (i < || j < )
{
break;
}
sqlList.Add(str.Substring(sum, j));
sum += j + ;
}
for (int index = ; index < sqlList.Count && index < list.Count; index++)
{
str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
}
return str;
}

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

static void Main(string[] args)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("ID", "");
dic.Add("Name", "jimmy.pan");
string sql = _sql;
Console.WriteLine(AnalyticalByDic(sql, dic));
List<string> list = new List<string>();
list.Add("");
list.Add("jimmy");
sql = _sql;
Console.WriteLine(AnalyticalByList(sql, list));
Console.Read();
}

5.运行结果如下图

6.整体代码

using System;
using System.Collections.Generic; namespace SQLAnalytical
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("ID", "");
dic.Add("Name", "jimmy.pan");
string sql = _sql;
Console.WriteLine(AnalyticalByDic(sql, dic));
List<string> list = new List<string>();
list.Add("");
list.Add("jimmy");
sql = _sql;
Console.WriteLine(AnalyticalByList(sql, list));
Console.Read();
} /// <summary>
/// 根据SQL和参数集合解析成需要执行的SQL
/// </summary>
/// <param name="str"></param>
/// <param name="dic"></param>
/// <returns></returns>
public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
{
str = str.ToUpper();
foreach (var item in dic)
{
str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
}
return str;
} /// <summary>
/// 根据SQL和参数集合解析成需要执行的SQL
/// </summary>
/// <param name="str"></param>
/// <param name="list"></param>
/// <returns></returns>
public static string AnalyticalByList(string str, List<string> list)
{
str = str.ToUpper();
List<string> sqlList = new List<string>();
var sqlstr = str;
int i = ;
int j = ;
int sum = ;
while (true)
{
i = str.Substring(sum, str.Length - sum).IndexOf('#') + ;
sum += i;
j = str.Substring(sum, str.Length - sum).IndexOf('#');
if (i < || j < )
{
break;
}
sqlList.Add(str.Substring(sum, j));
sum += j + ;
}
for (int index = ; index < sqlList.Count && index < list.Count; index++)
{
str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
}
return str;
} /// <summary>
/// 暂时用于测试
/// </summary>
static string _sql = "SELECT * FROM TB_USER WHERE ID = #ID# AND NAME LIKE '%#NAME#%'"; }
}

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++程序设计原理与实践(进阶篇)

    使用宏的时候一定要小心:在c中没有真正有效的方法来避免使用宏,但宏带有严重的副作用,因为宏不遵守通常的c(或c++)作用域和类型规则——它只是一种文本替换.   宏的使用注意事项: 所以宏名全部大写. ...

  2. 结对作业-WordCount进阶版

    1.在文章开头给出博客作业要求地址. 博客园地址:https://www.cnblogs.com/happyzm/p/9559372.html 2.给出结对小伙伴的学号.博客地址,结对项目的码云地址. ...

  3. vi—终端中的编辑器

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  4. 洛谷P1640 [SCOI2010]连续攻击游戏(二分图)

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  5. CI框架部署后访问出现404

    昨天新配置了一个PHP集成开发环境,安装完后,把项目放到Apache服务器的www目录下,发现只能打开首页,其他页面全部无法打开,当时比较纳闷,以为是服务器没有配置好,测试了一下,发现环境配置没有问题 ...

  6. bdd相关整理介绍

    BDD介绍 什么是BDD Behavior-driven development In software engineering, behavior-driven development (BDD) ...

  7. 洛谷 P2234 [HNOI2002]营业额统计

    题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...

  8. MarkDown语法实操

    一级标题 这是引用 二级标题 https://daringfireball.net/projects/markdown/dingus 你好啊,这是斜体 引用 添加图片 图片alt就是显示在图片下面的文 ...

  9. python学习之路---day20--面向对象--多继承和super() 函数

    一:python多继承 python多继承中,当一个类继承了多个父类时候,这个类拥有多个父类的所欲非私有的属性 l例子: class A: pass class B(A): pass class C( ...

  10. day13--------python 内置函数(一)

    一:内置函数 内置函数就是python直接提供可以用的 01:作用域相关: locals() 返回当前作用域中的名字 globals() 返回全局作用域中的名字 02:迭代器相关: range() 生 ...