我们在做程序的时候有事后会涉及到利用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文件解析都是一样的