原文:C#和Java中执行SQL文件脚本的代码(非常有用)

我们在做程序的时候有事后会涉及到利用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 = 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 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文件解析都是一样的

C#和Java中执行SQL文件脚本的代码(非常有用)的更多相关文章

  1. 使用java以及jdbc不使用第三方库执行sql文件脚本

    使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...

  2. qt中执行 sql文件的方法

    由于qt中没有原生的执行sql文件的方法.因此我们需要根据sql文件中的流的特点,将其分解成一个个语句单独执行. 1.首先通过Qfile读取sql文件 2.将sql文件中的内容通过“:”进行拆解 3. ...

  3. PHP执行.SQL文件的实例代码分享

    介绍下使用PHP执行.SQL文件的代码一例,分享下. demo.php: <?php ) )) ) ENGINE) unsigned ) unsigned )) ) ENGINE) unsign ...

  4. 去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本

    package com.xxx.xxx.dao; import java.io.BufferedReader; import java.io.File; import java.io.FileInpu ...

  5. 运行执行sql文件脚本的例子

    sqlcmd -s -d db_test -r -i G:\test.sql 黑色字体为关键命令,其他颜色(从左至右):服务器名称,用户名,密码,数据库,文件路径 通过select @@servern ...

  6. 在 PL/SQL Developer 中执行SQL文件的方法

    打开 command Window SQL> @'D:\My Documents\Downloads\bde_chk_cbo.sql'; 整个路径及文件两边要有单引号哦!

  7. Java中执行.exe文件

    public static void main(String args[]){ try { String command ="notepad"; // 笔记本 Process ch ...

  8. 在eclipse中执行sql的编码问题

    症状-分析: 刚才在eclipse中执行sql文件,发现数据进入数据库的时候总是乱码 后来查看MySQL的编码设置,全是UTF8,没问题,sql文件本身也是UTF8的编码 并且,使用MySQL的CMD ...

  9. 如何在linux中运行sql文件

    1.在linux中进入sql命令行 mysql -u root -p   输入密码 2.假设home下面有a.sql文件 先得use databasename,要不会报错 “No Database S ...

随机推荐

  1. Prototype Pattern 原型模式

    7.6 原型模式总结 原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,很多软件提供的复制(Ctrl + C)和粘贴(Ctrl + V)操作就是原型模式的典型应用,下面对该模 ...

  2. c#并行任务多种优化方案分享(异步委托)

    遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功 ...

  3. 数据结构读书笔记(二)(C语言)

    (一)循环链表 存储类型 typedef struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode *Link ...

  4. sql二进制数据权限

    (3为权限组合值,结果为1=列表 2=新建 4=修改 8=删除) select 3 & 1 select 3 & 2 select 3 & 4 select 3 & 2 ...

  5. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

  6. zoj 2156 - Charlie&#39;s Change

    称号:拼布钱,表面值至1,5.10.25.寻求组成n表面值硬币的最大数目. 分析:dp,01背包.需要二元分割,除此以外TLE.使用每个硬币的数组记录数.轻松升级. 写了一个 多重背包的 O(NV)反 ...

  7. poj2112 Optimal Milking --- 最大流量,二分法

    nx一个挤奶器,ny奶牛,每个挤奶罐为最m奶牛使用. 现在给nx+ny在矩阵之间的距离.要求使所有奶牛挤奶到挤奶正在旅程,最小的个体奶牛步行距离的最大值. 始感觉这个类似二分图匹配,不同之处在于挤奶器 ...

  8. JS达到Web指定保存的和打印功能的内容

    背景 首先,说说文章的背景.近期手中的一个项目,因为需求中要求提供Web界面的打印功能.当然假设没有打印机,还能够提供保存到本地.项目组长把这个"小任务"分给了我.本着努力为组长分 ...

  9. Play Modules Morphia 1.2.9a 之 Aggregation and Group aggregation

    聚合 和 分组聚合: PlayMorphia 它提供了基于开发人员models的友好接口 设想你定义了一个model.class Sales: @Entity public class Sales e ...

  10. 第一篇——第一文 SQL Server 备份基础

    原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net ...