java sqlExec判断sql文件是否正确小弟想用ant的sqlExec来检测多个sql文件的语法和编码是否正确(每个sql文
java sqlExec判断sql文件是否正确 小弟想用ant的sqlExec来检测多个sql文件的语法和编码是否正确(每个sql文件可能包含多个sql语句),代码如下: /** * 在指定的数据库上执行脚本, * @param db * @param sqlPath 数据库脚本目录 * @param fileName 脚本文件名 * @param logPath 执行结果日志文件,如果为null不记日志 */ import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.SQLExec; import org.apache.tools.ant.types.EnumeratedAttribute; public boolean judgeScript(String db,String sqlPath,String fileName,String logPath){ if(!(sqlPath.endsWith("/")||sqlPath.endsWith(File.separator))){ sqlPath+=File.separator; } SQLExec sqlExec = new SQLExec(); sqlExec.setDriver(driver); sqlExec.setUrl(urlPrefix+db); sqlExec.setUserid(dbUserid); sqlExec.setPassword(dbPWD); sqlExec.setDelimiter("GO"); sqlExec.setSrc(new File(sqlPath+fileName));//"continue", "stop" "abort" sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "continue"))); //sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "abort"))); sqlExec.setAutocommit(true); if(logPath!=null){ sqlExec.setPrint(true); if(!(logPath.endsWith("/")||logPath.endsWith(File.separator))){ logPath+=File.separator; } sqlExec.setOutput(new File(logPath+ip+"_"+dbPort+"_"+db+"_"+fileName+".log")); } sqlExec.setProject(new Project()); try{ sqlExec.execute(); //System.out.println("成功更新"+ip+":"+dbPort+";dbName="+db+"脚本"+fileName); //updateLog.append("更新"+ip+":"+dbPort+";dbName="+db+"脚本"+fileName+"\n"); return true; }catch (Exception e){ //updateLog.append("服务器:"+ip+e.getMessage()); System.out.println("更新失败"+ip+":"+dbPort+";dbName="+db+"脚本"+fileName); return false; } } 但这样处理,在异常中没有抓到那些有语法错误和乱码的sql文件,请问大牛们该如何处理 PS:statement的方法就不考虑了,因为还要将sql文件拆分成sql语句,很麻烦[最优解释]
引用: 貌似搞定了 //sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "continue"))); sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnEr…… 根据文档描述,continue也会打印错误的
[其他解释] sqlExec.execute();
这句在执行时你应该清楚具体是哪句sql在执行,这样一旦发生异常,就可以把该sql连同异常一起记录
[其他解释] sqlExec.execute();
这句是对整个sql文件进行读取执行吧,该怎么处理才能抓到执行时的异常呢?
[其他解释] 引用: sqlExec.execute(); 这句是对整个sql文件进行读取执行吧,该怎么处理才能抓到执行时的异常呢? 当发生sql错误时,它不抛出异常么?
如果抛出,根据异常类型分类处理就可以了。
[其他解释] catch (Exception e){
//updateLog.append("服务器:"+ip+e.getMessage());
System.out.println("更新失败"+ip+":"+dbPort+";dbName="+db+"脚本"+fileName);
return false;
}
在这里木有捕捉到异常,我用有语法错误的脚本,有乱码的脚本都测试过了
[其他解释] 引用: catch (Exception e){ //updateLog.append("服务器:"+ip+e.getMessage()); System.out.println("更新失败"+ip+":"+dbPort+";dbName="+db+"脚本"+fileName); return false; } 在这里木有捕捉到异常,我用有语法错误的脚本,有乱码的脚本都测试过了
如果连错误的语句都捕捉不到异常,那你是如何判断执行成功与否的?
[其他解释] 就是这里很头疼,只能默认为开发者提交的脚本都是可以执行的,还怎么加校验呢
[其他解释] 引用: 就是这里很头疼,只能默认为开发者提交的脚本都是可以执行的,还怎么加校验呢 不是,如果Exception不会被catch到,那还加那个try catch干吗
[其他解释] 这里捕捉到的异常都是数据库连接不上之类的错误
[其他解释] 貌似搞定了
//sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "continue")));
sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "abort")));
出错了直接中断掉就可以了
[其他解释] 引用: 这里捕捉到的异常都是数据库连接不上之类的错误 我看了SQLExec的介绍:
The onerror attribute specifies how to proceed when an error occurs during the execution of one of the statements. The possible values are: continue execution, only show the error; stop execution and commit transaction; and abort execution and transaction and fail task.
发现是设置了onerror属性后(楼主设置了),会显示错误的,错误的话就会知道哪句sql错了,这样不就够了吗?
[其他解释] 我debug的结果是continue的话,即使脚本错误,还是会执行且无法抛出异常
abort的话就没问题了,多谢LS,散分了
[其他解释] 引用: 我debug的结果是continue的话,即使脚本错误,还是会执行且无法抛出异常 abort的话就没问题了,多谢LS,散分了 异常是不抛出,但是应该会默认在控制台显示错误的~only show the error.