我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析
去除其中的注释,还有把每一句sql语句取出来,然后再利用各个平台中的数据库相关执行它。
接下来放代码!
java版本的
001 | package com.zz; |
002 |
003 | import java.io.*; |
004 | import java.util.ArrayList; |
005 | import java.util.Enumeration; |
006 | import java.util.List; |
007 | import java.util.Vector; |
008 |
009 | /* |
010 | * 作者 祝君 |
011 | * 时间 2014年1月16号 |
012 | * java执行数据库脚本代码 |
013 | */ |
014 | public class SqlHelper { |
015 |
016 | /** |
017 | * @param args |
018 | */ |
019 | public static void main(String[] args) { |
020 | |
021 | String path=new String("d:\\zzadmin.sql"); |
022 | String sql=GetText(path); |
023 | String[] arr=getsql(sql); |
024 | for(int i=0;i<arr.length;i++) |
025 | System.out.println("第"+i+"句:"+arr[i]); |
026 |
027 | } |
028 | public static String GetText(String path){ |
029 | File file=new File(path); |
030 | if(!file.exists()||file.isDirectory()) |
031 | return null; |
032 | StringBuffer sb=new StringBuffer(); |
033 | try |
034 | { |
035 | FileInputStream fis = new FileInputStream(path); |
036 | InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); |
037 | BufferedReader br = new BufferedReader(isr); |
038 | String temp=null; |
039 | temp=br.readLine(); |
040 | while(temp!=null){ |
041 | sb.append(temp+"\r\n"); |
042 | temp=br.readLine(); |
043 | } |
044 | } catch (Exception e) { |
045 | e.printStackTrace(); |
046 | } |
047 | return sb.toString(); |
048 | } |
049 |
050 | /** |
051 | * 获取sql文件中的sql语句数组 |
052 | * @param sql |
053 | * @return 数组 |
054 | */ |
055 | public static String[] getsql(String sql) |
056 | { |
057 | String s=sql; |
058 | s=s.replace("\r\n","\r"); |
059 | s=s.replace("\r", "\n"); |
060 | String[] ret=new String[1000]; |
061 | String[] sqlarray=s.split(";\n"); |
062 | sqlarray=filter(sqlarray); |
063 | int num=0; |
064 | for (String item : sqlarray) |
065 | { |
066 | String ret_item = ""; |
067 | String[] querys = item.trim().split("\n"); |
068 | querys = filter(querys);//去空 |
069 | for (String query : querys) |
070 | { |
071 | String str1 = query.substring(0, 1); |
072 | String str2 = query.substring(0, 2); |
073 | if (str1.equals("#") || str2.equals("--") || str2.equals("/*") || str2.equals("//"))//去除注释的关键步奏 |
074 | { |
075 | continue; |
076 | } |
077 | ret_item += query; |
078 | } |
079 | ret[num] = ret_item; |
080 | num++; |
081 | } |
082 | return filter(ret); |
083 | } |
084 | /// <summary> |
085 | /// 去除空值数组 |
086 | /// </summary> |
087 | /// <param name="ss">数组</param> |
088 | /// <returns></returns> |
089 | public static String[] filter(String[] ss) |
090 | { |
091 | List<String> strs = new ArrayList<String>(); |
092 | for (String s : ss) { |
093 | if (s != null && !s.equals("")) |
094 | strs.add(s); |
095 | } |
096 | |
097 | String[] result=new String[strs.size()]; |
098 | for(int i=0;i<strs.size();i++) |
099 | { |
100 | result[i]=strs.get(i).toString(); |
101 | } |
102 | return result; |
103 | } |
104 | |
105 | //删除注释 |
106 | public void deletezs(String fileStr) |
107 | { |
108 | try{ |
109 | Vector<String> vec=new Vector<String>(); |
110 | String str="",tm="",mm=""; |
111 | BufferedReader br = new BufferedReader( new FileReader(fileStr)); |
112 | boolean bol=false; |
113 | while( null != (str = br.readLine() ) ) |
114 | { |
115 | if ((str.indexOf("/*")>=0)&&((bol==false))) |
116 | { |
117 | if (str.indexOf("*/")>0) |
118 | { |
119 | bol=false; |
120 | vec.addElement(str.substring(0,str.indexOf("/*"))+str.substring(str.indexOf("*/")+2,str.length())); |
121 | } |
122 | else |
123 | { |
124 | bol=true; |
125 | mm=str.substring(0,str.indexOf("/*")); |
126 | if (!(mm.trim().equals(""))) |
127 | vec.addElement(mm); |
128 | } |
129 | } |
130 | else if (bol==true) |
131 | { |
132 | if (str.indexOf("*/")>=0) |
133 | { |
134 | bol=false; |
135 | mm=str.substring(str.indexOf("*/ ")+ 2 ,str.length()); |
136 | if (!mm.trim().equals( "" )) |
137 | vec.addElement(mm); |
138 | } |
139 | } |
140 | else if (str.indexOf( "//" )>= 0 ) |
141 | { |
142 | tm=str.substring( 0 ,str.indexOf( "//" )); |
143 | if (!tm.trim().equals( "" )) |
144 | vec.addElement(tm); |
145 | } |
146 | else |
147 | { |
148 | vec.addElement(str); |
149 | } |
150 | } |
151 | br.close(); |
152 | File fName= new File(fileStr); |
153 | FileWriter in= new FileWriter(fName); |
154 | String ssss= "" ; |
155 | Enumeration<String> ew=vec.elements(); |
156 |
157 | while (ew.hasMoreElements()) { |
158 | ssss= ew.nextElement().toString(); |
159 | in.write(ssss+ "\n" ); |
160 | } |
161 |
162 | in.close(); |
163 | vec.clear(); |
164 |
165 | } catch (Exception ee){ |
166 | ee.printStackTrace(); |
167 | } |
168 |
169 | } |
170 |
171 |
172 | } |
调用GetText就可以返回一个装满了sql语句的数组,循环执行其中的sql语句吧
c#版本的
001 | //-------------------------第一种------------------------------------- |
002 | /// <summary> |
003 | /// 获取sql文件中的sql语句数组 第一种方法 |
004 | /// </summary> |
005 | /// <param name="sql"></param> |
006 | /// <returns></returns> |
007 | public static string [] sql_split( string sql) |
008 | { |
009 | string s = sql; |
010 | Regex reg = new Regex( "/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/" ); |
011 | reg.Replace(sql, "ENGINE=\\1 DEFAULT CHARSET=utf8" ); |
012 | s = s.Replace( '\r' , '\n' ); |
013 | string [] ret = new string [10000]; |
014 | string [] sqlarray = StringSplit(s, ";\n" ); |
015 | int num = 0; |
016 | foreach ( string item in sqlarray) |
017 | { |
018 | ret[num] = "" ; |
019 | string [] queries = item.Split( '\n' ); |
020 | queries = filter(queries); |
021 | foreach ( string query in queries) |
022 | { |
023 | string str1 = query.Substring(0, 1); |
024 | string str2 = query.Substring(0, 2); |
025 | if (str1 != "#" && str2 != "--" && str2 != "/*" && str2 != "//" )//去除注释的关键步奏 |
026 | { |
027 | ret[num] += query; |
028 | } |
029 | } |
030 | num++; |
031 | } |
032 | ret = filter(ret); |
033 | return ret; |
034 | } |
035 |
036 | /// <summary> |
037 | /// 去除空值数组 |
038 | /// </summary> |
039 | /// <param name="ss"></param> |
040 | /// <returns></returns> |
041 | public static string [] filter( string [] ss) |
042 | { |
043 | List< string > strs = new List< string >(); |
044 | foreach ( string s in ss) |
045 | { |
046 | if (! string .IsNullOrEmpty(s)) strs.Add(s); |
047 | } |
048 | string [] result = strs.ToArray(); |
049 | return result; |
050 | } |
051 | /// <summary> |
052 | /// 将字符串分割成数组 |
053 | /// </summary> |
054 | /// <param name="strSource"></param> |
055 | /// <param name="strSplit"></param> |
056 | /// <returns></returns> |
057 | public static string [] StringSplit( string strSource, string strSplit) |
058 | { |
059 | string [] strtmp = new string [1]; |
060 | int index = strSource.IndexOf(strSplit, 0); |
061 | if (index < 0) |
062 | { |
063 | strtmp[0] = strSource; |
064 | return strtmp; |
065 | } |
066 | else |
067 | { |
068 | strtmp[0] = strSource.Substring(0, index); |
069 | return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp); |
070 | } |
071 | } |
072 |
073 | /// <summary> |
074 | /// 采用递归将字符串分割成数组 |
075 | /// </summary> |
076 | /// <param name="strSource"></param> |
077 | /// <param name="strSplit"></param> |
078 | /// <param name="attachArray"></param> |
079 | /// <returns></returns> |
080 | private static string [] StringSplit( string strSource, string strSplit, string [] attachArray) |
081 | { |
082 | string [] strtmp = new string [attachArray.Length + 1]; |
083 | attachArray.CopyTo(strtmp, 0); |
084 |
085 | int index = strSource.IndexOf(strSplit, 0); |
086 | if (index < 0) |
087 | { |
088 | strtmp[attachArray.Length] = strSource; |
089 | return strtmp; |
090 | } |
091 | else |
092 | { |
093 | strtmp[attachArray.Length] = strSource.Substring(0, index); |
094 | return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp); |
095 | } |
096 | } |
097 |
098 | //----------------------------------------------------- |
099 |
100 | //-----------------------第二种------------------------------ |
101 | /// <summary> |
102 | /// 获取sql文件中的sql语句数组 第二种 |
103 | /// </summary> |
104 | /// <param name="sql"></param> |
105 | /// <returns></returns> |
106 | public string [] getsqls( string sql) |
107 | { |
108 | string s = sql; |
109 | s = s.Replace( "\r\n" , "\n" ); |
110 | s = s.Replace( "\r" , "\n" ).Trim(); |
111 | string [] ret = new string [1000]; |
112 |
113 | string [] sqlarray= StringSplit(s, ";\n" ); |
114 | sqlarray = filter(sqlarray); //去空 |
115 |
116 | int num=0; |
117 | foreach ( string item in sqlarray) |
118 | { |
119 | string ret_item = "" ; |
120 | string [] querys = item.Trim().Split( '\n' ); |
121 | querys = filter(querys); //去空 |
122 |
123 | foreach ( string query in querys) |
124 | { |
125 | string str1 = query.Substring(0, 1); |
126 | string str2 = query.Substring(0, 2); |
127 | if (str1 == "#" || str2 == "--" || str2 == "/*" || str2 == "//" )//去除注释的关键步奏 |
128 | { |
129 | continue ; |
130 | } |
131 | ret_item += query; |
132 | } |
133 | ret[num] = ret_item; |
134 | num++; |
135 | } |
136 | return filter(ret); |
137 | } |
c#两个方法对sql文件解析都是一样的