首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java sqlExec判断sql资料是否正确

2012-12-17 
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.

热点排行