您的位置:首页 > 数据库

c#和java中执行sql文件脚本的代码(非常有用)

2014-01-17 18:24 591 查看
我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析

去除其中的注释,还有把每一句sql语句取出来,然后再利用各个平台中的数据库相关执行它。



接下来放代码!

java版本的

package com.zz;

import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

/*
 * 作者 祝君 
 * 时间 2014年1月16号
 * java执行数据库脚本代码
 */
public class SqlHelper {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		String path=new String("d:\\zzadmin.sql");
		String sql=GetText(path);
		String[] arr=getsql(sql);
		for(int i=0;i<arr.length;i++)
			System.out.println("第"+i+"句:"+arr[i]);

	}
	public static String GetText(String path){
		File file=new File(path);
		if(!file.exists()||file.isDirectory())
			return null;
		StringBuffer sb=new StringBuffer();
		try 
		{
			FileInputStream fis = new FileInputStream(path); 
		    InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
		    BufferedReader br = new BufferedReader(isr); 
			String temp=null;
			temp=br.readLine();
			while(temp!=null){
			sb.append(temp+"\r\n");
			temp=br.readLine();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	/**
	 * 获取sql文件中的sql语句数组
	 * @param sql
	 * @return 数组
	 */
	public static String[] getsql(String sql)
	{
		String s=sql;
		s=s.replace("\r\n","\r");
		s=s.replace("\r", "\n");
		String[] ret=new String[1000];
		String[] sqlarray=s.split(";\n");
		sqlarray=filter(sqlarray);
		int num=0;
		for (String item : sqlarray) 
		{
			String ret_item = "";
            String[] querys = item.trim().split("\n");
            querys = filter(querys);//去空
            for (String query : querys) 
            {
            	String str1 = query.substring(0, 1);
                String str2 = query.substring(0, 2);
                if (str1.equals("#") || str2.equals("--") || str2.equals("/*") || str2.equals("//"))//去除注释的关键步奏
                {
                    continue;
                }
                ret_item += query;
			}
            ret[num] = ret_item;
            num++;
		}
		return filter(ret);
	}
	/// <summary>
    /// 去除空值数组
    /// </summary>
    /// <param name="ss">数组</param>
    /// <returns></returns>
    public static String[] filter(String[] ss)
    {
        List<String> strs = new ArrayList<String>();
        for (String s : ss) {
        	 if (s != null && !s.equals("")) 
        		 strs.add(s);
		}
       
        String[] result=new String[strs.size()];
        for(int i=0;i<strs.size();i++)
        {
        	result[i]=strs.get(i).toString();
        }
        return result;
    }
    
    //删除注释
    public void deletezs(String fileStr)
    {
      try{
      Vector<String> vec=new Vector<String>();
      String str="",tm="",mm="";
      BufferedReader br = new BufferedReader( new FileReader(fileStr));
      boolean bol=false;
      while( null != (str = br.readLine() ) )
      {
        if ((str.indexOf("/*")>=0)&&((bol==false)))
        {
          if (str.indexOf("*/")>0)
          {
            bol=false;
            vec.addElement(str.substring(0,str.indexOf("/*"))+str.substring(str.indexOf("*/")+2,str.length()));
          }
          else
          {
             bol=true;
             mm=str.substring(0,str.indexOf("/*"));
             if (!(mm.trim().equals("")))
                 vec.addElement(mm);
          }
        }
        else if (bol==true)
        {
        	if (str.indexOf("*/")>=0)
            {
                bol=false;
                mm=str.substring(str.indexOf("*/")+2,str.length());
                if (!mm.trim().equals(""))
                   vec.addElement(mm);
            }
        }
        else if (str.indexOf("//")>=0)
        {
                     tm=str.substring(0,str.indexOf("//"));
                     if (!tm.trim().equals(""))
                        vec.addElement(tm);
        }
        else
        {
            vec.addElement(str);
        }
      	}
      br.close();
      File fName=new File(fileStr);
      FileWriter in=new  FileWriter(fName);
      String ssss="";
      Enumeration<String> ew=vec.elements();

             while (ew.hasMoreElements()) {
               ssss= ew.nextElement().toString();
               in.write(ssss+"\n");
             }

      in.close();
      vec.clear();

      }catch(Exception ee){
    	  ee.printStackTrace();
      }

    }

}


调用GetText就可以返回一个装满了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 = new Regex("/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);
                return StringSplit(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, string strSplit, 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);
                return StringSplit(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文件解析都是一样的

随便调用哪一个都可以哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: