在項目中使用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#%'"; } }