SQL动态配置,动态解析SQL
在项目中使用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的更多相关文章
- Delphi动态配置ODBC数据源--SQL Server版本
(摘自)http://jxlearnew.blog.163.com/blog/static/549786592007102451431413/ 这里介绍一种用Delphi来实现动态注册的方法,希望对各 ...
- 使用不同模板引擎beetl、FreeMarker、Velocity动态解析sql的方法
1. String sql = null;if(null == renderType || renderType.equals(ConstantRender.sql_renderType_beetl) ...
- MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作
一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接 ...
- 学习动态性能表 v$sql
学习动态性能表 第三篇-(1)-v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存 ...
- .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. ...
- Quartz动态添加定时任务执行sql(服务启动添加+手动添加)
系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...
- MyBatis框架之SQL映射和动态SQL
使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...
- .NET在EF中使用sql,用动态类吧!
.NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...
- PL/SQL开发中动态SQL的使用方法
一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使 ...
随机推荐
- Xcode9新功能
1.折叠代码 局部折叠(折叠一个函数):Command+Option+Left/Right 全局折叠(折叠当前文件下的全部函数): Shift+Command+Option+Left/Right 折叠 ...
- C语言#include的用法
1.#include 命令介绍 #include 命令是预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置:可以标识出只有在特定条件下才会被编译的某一段程序代码: 可以定义类似标识符功 ...
- 题解 P1434 【滑雪】
题目链接 此题运用功能强大的 ~~暴力搜索~~ 记忆化搜索才是重点!!! 然而,这是一道经典的DP问题 如果我们用$dis[i][j]$来表示坐标为$(i,j)$时的高度 $cnt[i][j]$ 是我 ...
- Python爬取招聘信息,并且存储到MySQL数据库中
前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...
- PHP中使用CURL之php curl详细解析和常见大坑
这篇文章主要介绍了PHP中使用CURL之php curl详细解析和常见大坑 ,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 七夕啦,作为开发,妹子没得撩就“撩”下服务器吧,妹子有得撩的同学 ...
- Android中include标签的使用(打开引用布局,隐藏当前布局)
在开发app的时候,有时候一个布局会反复用到,可以把反复用到的布局单独写一个xml文件,什么时候用到就用includ标签引入xml 下面是我写的反复用到的一个xml,里面有2个button,一个Tex ...
- JavaWeb学习笔记(四)—— response
一.response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服 ...
- Android 查看联系人电话和姓名(ContentProvider)
1.介绍 2.使用方法 3.在AndroidManifest.xml文件中添加相关设置 <uses-permission android:name="android.permissio ...
- oracle三种连接身份
登录oracle数据库有三种连接身份 sysdba:数据库管理员,sysyoper:数据库操作员,normal:普通用户. "sysdba" 即数据库管理员 权限包括: 打 ...
- 关于去掉输入一定数字n,在n后写入n个字符串的问题
在输入数字n后要用一个getchar 去吃掉数字n后面跟着的回车符号,从而保证输入的字符串数是和n是保持一致的 具体实例代码如下: #include<stdio.h> #include&l ...