日期:2014-05-20  浏览次数:20836 次

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());