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

2014-11-24 03:11:23 · 作者: · 浏览: 0

我们在做程序的时候有事后会涉及到利用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
  
   
    /// 去除空值数组
    /// 
    /// 
   数组
    /// 
   
    public static String[] filter(String[] ss)
    {
        List
   
     strs = new ArrayList
    
     (); for (String s : ss) { if (s != null && !s.equals("")) strs.add(s); } String[] result=new String[strs.size()]; for(int i=0;i
     
       vec=new Vector
      
       (); 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
       
         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#版本的

 //-------------------------第一种-------------------------------------
        /// 
        /// 获取sql文件中的sql语句数组 第一种方法
        /// 
        /// 
        /// 
  
        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;
        }

        /// 
        /// 去除空值数组
        /// 
        /// 
        /// 
  
        public static string[] filter(string[] ss)
        {
            List
  
    strs = new List
   
    (); foreach (string s in ss) { if (!string.IsNullOrEmpty(s)) strs.Add(s); } string[] result = strs.ToArray(); return result; } /// 
     /// 将字符串分割成数组 ///  /// 
     /// 
     /// 
     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); } } /// 
     /// 采用递归将字符串分割成数组 ///  /// 
     /// 
     /// 
     /// 
     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); } } //----------------------------------------------------- //-----------------------第二种------------------------------ /// 
     /// 获取sql文件中的sql语句数组 第二种 ///  /// 
     /// 
     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文件解析都是一样的

随便调用哪一个都可以哈