最近使用JNDI连接oracle数据库时出现了这个问题,先来个出错的代码吧:
..........省略部分代码...............
String strSql = "select result from userinfo where userNo=?";
String risk_level = null;
try {
init();
//conn = SybaseServiceLocator.getInstance().getDBConn();
ps = conn.prepareStatement(strSql);
ps.setString(1, userNo);
rs = ps.executeQuery();
if (rs.next()) {
result = rs.getString("result );
}
} catch (SQLException e) {
logger.error("执行sql语句出错!");
} finally {
cleanup();
}
return result ;
..........省略部分代码...............
上面的代码居然报了oracle ORA-00904:“userNo” is invalid identifier这个错误!!!奇怪了,这条sql语句在我在数据库中都是可以执行的呀!!怎么回事呢?网上给的思路大多数都是字段名写错了或者表名不存在等等这些情况,我都参照了还是解决不了!经过一番思考,终于找到原因了!
原来我用oracle的JNDI连接去执行sybase数据库的sql语句,这样子肯定会报错的。也就是上面代码中的init()语句包含了oracle数据库的连接,正常来说应该使用注释掉的conn = SybaseServiceLocator.getInstance().getDBConn();这条语句建立与sybase数据库的连接,而不应该使用init()方法,于是很简单,稍微改成如代码就行了:
..........省略部分代码...............
String strSql = "select result from userinfo where userNo=?";
String risk_level = null;
try {
conn = SybaseServiceLocator.getInstance().getDBConn();
ps = conn.prepareStatement(strSql);
ps.setString(1, userNo);
rs = ps.executeQuery();
if (rs.next()) {
result = rs.getString("result );
}
} catch (SQLException e) {
logger.error("执行sql语句出错!");
} finally {
cleanup();
}
return result ;
..........省略部分代码...............
这其实不算真正意义上的bug,说到底就是自己的存心造成的!!看来以后自己要更加小心了!!!
关于这个问题更详细的解析,大家可以参考下这个博客:
https://www.cnblogs.com/wintergrass/archive/2011/05/07/2039575.html