我用CachedRowSet查询数据,在本地以前没有问题,现在老是报下面的错,但是放在服务器上又没什么问题,不知道为什么,程序也完全一样。希望各位高人指点。
错误信息如下:
java.sql.SQLException: Invalid precision value. Cannot be less than zero
at javax.sql.rowset.RowSetMetaDataImpl.setPrecision(RowSetMetaDataImpl.java:354)
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:707)
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:620)
at com.hand.db.DbConnPool.executeQuery(DbConnPool.java:73)
at com.hand.db.DbFactory.getDataList(DbFactory.java:637)
at com.hand.db.article.ArticleDao.findAdByClassid(ArticleDao.java:177)
at com.hand.tag.AdTag.doEndTag(AdTag.java:44)
at org.apache.jsp.index_jsp._jspx_meth_i_005fad_005f0(index_jsp.java:545)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:177)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.hand.util.LoginFilter.doFilter(LoginFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.hand.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:124)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)在findAdByClassid里面调用了getDataList方法,传入一个sql语句。这个没问题。getDataList方法已经用过N遍了,也没问题。源代码如下:
/**
 * 查看指定记录
 * 
 * @param sql
 *            String 执行查询sql语句
 * 
 * @return list List 返回查询结果
 */
public List<HashMap> getDataList(String sql) { int colCount;
List<HashMap> list = new ArrayList<HashMap>(); try {
ResultSet rs = DbConnPool.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
if (meta != null) {
colCount = meta.getColumnCount(); /** ***********获得结果集合************ */
while (rs.next()) {
HashMap map = new HashMap();
for (int i = 1; i <= colCount; i++) {
String fieldName = meta.getColumnName(i);
Object fieldValue = rs.getObject(fieldName);
if (fieldValue == null) {
fieldValue = "";
} map.put(fieldName.toUpperCase(), fieldValue);
}
list.add(map);
} // 完成取结果集合工作
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
if (list == null) {
list = new ArrayList<HashMap>();
} return list;
}问题就出现在下面红色的地方,奇怪的是调用下面的方法,查询很多条记录时,没有问题,但查询某一条记录时就出现了错误。/**
 * 函数:executeQuery 功能:数据查询
 */
public static CachedRowSet executeQuery(String sql) {
Connection conn = null;
CachedRowSet crs = null;
try {
crs = new CachedRowSetImpl();
conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
crs.populate(rs);
rs.close();
stmt.close();
} catch (Exception e) {
// System.out.println(e.toString());
e.printStackTrace();
} finally {
close(conn);
}
return crs;
}