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#%'";

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM