zoukankan      html  css  js  c++  java
  • C#和Java中执行SQL文件脚本的代码(非常有用)

    我们在做程序的时候有事后会涉及到利用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+"
    ");
                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("
    ","
    ");
            s=s.replace("
    ", "
    ");
            String[] ret=new String[1000];
            String[] sqlarray=s.split(";
    ");
            sqlarray=filter(sqlarray);
            int num=0;
            for (String item : sqlarray) 
            {
                String ret_item = "";
                String[] querys = item.trim().split("
    ");
                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+"
    ");
                 }
    
          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('
    ', '
    ');
               string[] ret = new string[10000];
               string[] sqlarray = StringSplit(s, ";
    ");
               int num = 0;
               foreach (string item in sqlarray)
               {
                   ret[num] = "";
                   string[] queries = item.Split('
    ');
                   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("
    ", "
    ");
               s = s.Replace("
    ","
    ").Trim();
               string[] ret = new string[1000];
    
               string[] sqlarray= StringSplit(s, ";
    ");
               sqlarray = filter(sqlarray);//去空
    
               int num=0;
               foreach (string item in sqlarray)
               {
                   string ret_item = "";
                   string[] querys = item.Trim().Split('
    ');
                   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文件解析都是一样的

    http://www.open-open.com/lib/view/open1391348590035.html

  • 相关阅读:
    POJ 3694 Network (求桥,边双连通分支缩点,lca)
    UVA 796
    UVA 315 315
    POJ 1236 Network of Schools (有向图的强连通分量)
    【转】有向图强连通分量的Tarjan算法
    HDU 3072 Intelligence System (强连通分量)
    【转】强大的vim配置文件,让编程更随意
    WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法
    phpstorm+Xdebug断点调试PHP
    PHP性能调优---PHP调试工具Xdebug安装配置教程
  • 原文地址:https://www.cnblogs.com/rinack/p/3672224.html
Copyright © 2011-2022 走看看