我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析
去除其中的注释,还有把每一句sql语句取出来,然后再利用各个平台中的数据库相关执行它。
接下来放代码!
java版本的
001
class="keyword">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 = newRegex("/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
returnStringSplit(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, stringstrSplit, 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
returnStringSplit(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文件解析都是一样的