我們在做程序的時候有事後會涉及到利用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文件解析都是一樣的