我对数据库进行了查询,结果是通过java.sql.ResultSet获得的,因为此查询是动态的,返回的列数可以是5或7,在过去,使用相同的代码,它生成了一个“column not found exception”,并包含在以下捕获中:

try{
    sTemp = this.rsResults.getString("col3");
   }catch(Exception e){}

但现在使用相同的try-and-catch(唯一的区别是现在我使用的是combopooldatasource和它们的连接),我得到两个不属于catch的异常。
我怎样才能改善这一点,有没有更好的方法来检查列是否存在?
c3p0是否必须基于a(SQLState: S0022) column not found error强制测试连接?
Error n1 - in the com.mchange.v2.c3p0.impl.NewProxyResultSet.getString qlUtils.toSQLException() - Attempted to convert SQLException to SQLException. Leaving it alone. [SQLState: S0022; errorCode: 0]
java.sql.SQLException: Column 'col3' not found.

Error n2 -  DefaultConnectionTester.statusOnException() - Testing a Connection in response to an Exception:
java.sql.SQLException: Column 'col3' not found.

ps:使用的驱动程序相同org.gjt.mm.mysql.Driver

最佳答案

检查ResultSetMetaData

ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");

ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

// test the number of columns returned
if (numberOfColumns == 5) {
    //
} else {
    // numberOfColumns = 7
}

// or, test the column names
if ("col3".equals(rsmd.getColumnName(3)) {
    // col3 exists
}

编辑:
如果您不想对源代码进行修改,只想让您当前的方法也能与c3p0一起工作,那么只需捕获Throwable。(这确实让我不寒而栗:)
try {
    sTemp = this.rsResults.getString("col3");
} catch (Throwable t) {
    // Both, Exceptions and Errors are ignored now
}

关于java - 结果集“未找到列”与c3p0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17196790/

10-11 03:42