1. 程式人生 > 實用技巧 >]C#中執行SQL檔案指令碼的程式碼(非常有用)

]C#中執行SQL檔案指令碼的程式碼(非常有用)

我們在做程式的時候有事後會涉及到利用sql檔案 直接執行,可是在sql檔案中有很多註釋,我們要一句一句的執行首先必須的得把sql檔案解析

去除其中的註釋,還有把每一句sql語句取出來,然後再利用各個平臺中的資料庫相關執行它。

程式碼:    
c#版本的

    //-------------------------第一種-------------------------------------
           /// <summary>
           /// 獲取sql檔案中的sql語句陣列 第一種方法
           /// </summary>
           ///
<param name="sql"></param> /// <returns></returns> public static string[] sql_split(string sql) { string s = sql; Regex reg = newRegex("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/"); reg.Replace(sql,
"ENGINE=\\1 DEFAULT CHARSET=utf8"); s = s.Replace('\r', '\n'); string[] ret = new string[10000]; string[] sqlarray = StringSplit(s, ";\n"); int num = 0; foreach (string item in sqlarray) { ret[num]
= ""; string[] queries = item.Split('\n'); queries = filter(queries); foreach (string query in queries) { string str1 = query.Substring(0, 1); string str2 = query.Substring(0, 2); if (str1 != "#" && str2 != "--" && str2 != "/*"&& str2 != "//")//去除註釋的關鍵步奏 { ret[num] += query; } } num++; } ret = filter(ret); return ret; } /// <summary> /// 去除空值陣列 /// </summary> /// <param name="ss"></param> /// <returns></returns> public static string[] filter(string[] ss) { List<string> strs = new List<string>(); foreach (string s in ss) { if (!string.IsNullOrEmpty(s)) strs.Add(s); } string[] result = strs.ToArray(); return result; } /// <summary> /// 將字串分割成陣列 /// </summary> /// <param name="strSource"></param> /// <param name="strSplit"></param> /// <returns></returns> public static string[] StringSplit(string strSource, string strSplit) { string[] strtmp = new string[1]; int index = strSource.IndexOf(strSplit, 0); if (index < 0) { strtmp[0] = strSource; return strtmp; } else { strtmp[0] = strSource.Substring(0, index); returnStringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp); } } /// <summary> /// 採用遞迴將字串分割成陣列 /// </summary> /// <param name="strSource"></param> /// <param name="strSplit"></param> /// <param name="attachArray"></param> /// <returns></returns> private static string[] StringSplit(string strSource, stringstrSplit, string[] attachArray) { string[] strtmp = new string[attachArray.Length + 1]; attachArray.CopyTo(strtmp, 0); int index = strSource.IndexOf(strSplit, 0); if (index < 0) { strtmp[attachArray.Length] = strSource; return strtmp; } else { strtmp[attachArray.Length] = strSource.Substring(0, index); returnStringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp); } } //----------------------------------------------------- //-----------------------第二種------------------------------ /// <summary> /// 獲取sql檔案中的sql語句陣列 第二種 /// </summary> /// <param name="sql"></param> /// <returns></returns> public string[] getsqls(string sql) { string s = sql; s = s.Replace("\r\n", "\n"); s = s.Replace("\r","\n").Trim(); string[] ret = new string[1000]; string[] sqlarray= StringSplit(s, ";\n"); sqlarray = filter(sqlarray);//去空 int num=0; foreach (string item in sqlarray) { string ret_item = ""; string[] querys = item.Trim().Split('\n'); querys = filter(querys);//去空 foreach (string query in querys) { string str1 = query.Substring(0, 1); string str2 = query.Substring(0, 2); if (str1 == "#" || str2 == "--" || str2 == "/*"|| str2 == "//")//去除註釋的關鍵步奏 { continue; } ret_item += query; } ret[num] = ret_item; num++; } return filter(ret); } c#兩個方法對sql檔案解析都是一樣的