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 = 0;
    int j = 0;
    int sum = 0;
    while (true)
    {
        i = str.Substring(sum, str.Length - sum).IndexOf(#) + 1;
        sum += i;
        j = str.Substring(sum, str.Length - sum).IndexOf(#);
        if (i < 0 || j < 0)
        {
            break;
        }
        sqlList.Add(str.Substring(sum, j));
        sum += j + 1;
    }
    for (int index = 0; 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", "123");
    dic.Add("Name", "jimmy.pan");
    string sql = _sql;
    Console.WriteLine(AnalyticalByDic(sql, dic));
    List<string> list = new List<string>();
    list.Add("456");
    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", "123");
            dic.Add("Name", "jimmy.pan");
            string sql = _sql;
            Console.WriteLine(AnalyticalByDic(sql, dic));
            List<string> list = new List<string>();
            list.Add("456");
            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 = 0;
            int j = 0;
            int sum = 0;
            while (true)
            {
                i = str.Substring(sum, str.Length - sum).IndexOf(#) + 1;
                sum += i;
                j = str.Substring(sum, str.Length - sum).IndexOf(#);
                if (i < 0 || j < 0)
                {
                    break;
                }
                sqlList.Add(str.Substring(sum, j));
                sum += j + 1;
            }
            for (int index = 0; 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#%‘";

    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。