我可以连接JDBC驱动程序连接到数据库。断点显示它具有连接ID并且字段已正确填充,但在执行select语句后,即使数据位于数据库中且SQL调用在工作台中正常工作,也不会返回任何行。它只返回没有任何数据的字段名称。
为什么没有返回任何行?
代码:
public class DBConnect {
private static Connection conn;
public static String url = "jdbc:mysql://localhost/efwalter";
public static String user = "root";
public static String pass = "XXXXXXXXX";
private PreparedStatement prep;
public void open_Con() throws ClassNotFoundException {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
} catch (SQLException ex) {
infoBox(ex.toString(), "ERROR");
}
}
public ResultSet get_data(String SQL) {
try {
prep = conn.prepareStatement("SELECT * FROM efwalter.impact_tests");
ResultSet rs = prep.executeQuery();
return rs;
} catch (SQLException ex) {
infoBox(ex.toString(), "ERROR");
return null;
}
}
public void close_Con() {
try {
conn.close();
} catch (SQLException ex) {
infoBox(ex.toString(), "ERROR");
}
}
public void infoBox(String infoMessage, String location) {
JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + location, JOptionPane.INFORMATION_MESSAGE);
}
}
访问ResultSet的代码:
public void searchFired(ActionEvent event) throws ClassNotFoundException {
try{
DBConnect db = new DBConnect();
db.open_Con();
ResultSet rs = db.get_data();
db.close_Con();
while (rs.next())
{
study_struct study = new study_struct();
ObservableList<String> row = FXCollections.observableArrayList();
study.setStudy_number(rs.getInt(1));
row.add(rs.getString(1));
study.setCustomer_id(rs.getInt(2));
study.setShop_order(rs.getInt(3));
study.setProduct(rs.getString(4));
study.setGmax_results(rs.getString(5));
study.setGmax_average(rs.getDouble(6));
study.setHic_results(rs.getString(7));
study.setHic_average(rs.getDouble(8));
study.setSensor_data_x(rs.getString(9));
study.setSensor_data_y(rs.getString(10));
study.setDescription(rs.getString(11));
study.setGauge(rs.getString(12));
study.setAppraiser(rs.getString(13));
study.setStudy_name(rs.getString(14));
row.add(rs.getString(14));
study.setTimestamp(rs.getString(15));
row.add(rs.getString(15));
study.setWeight(rs.getString(16));
found_studies.add(study);
search_table.add(row);
}
resultsGrid.setItems(search_table);
}
catch (SQLException ex)
{
}
}
答案 0 :(得分:2)
作为JoshDM答案的延伸......
您需要确保在完成连接之前保持连接处于打开状态,但是您也应该尽一切努力确保连接正确关闭...
public void searchFired(ActionEvent event) throws ClassNotFoundException {
// This needs to be declared out side the try/catch so we can
// reference it later...
DBConnect db = new DBConnect();
try {
// Open the connection
db.open_Con();
// Get the data
ResultSet rs = db.get_data();
// Process the data
while (rs.next()) {
//...Trimmed for space ;)
}
resultsGrid.setItems(search_table);
} catch (SQLException ex) {
// It's never a good idea to "consume" exceptions,
// if you're not going to re-throw it, you should it at least
// log it
ex.printStackTrace();
} finally {
// Make every attempt to close the connection now we're finished with it...
try {
db.close_Con();
} catch (Exception e) {
}
}
}
答案 1 :(得分:1)
如果没有看到您应该发布的get_data()
方法的代码,我会怀疑您需要在关闭ResultSet
之前从connection
中提取数据。
以下是如何正确处理此问题的示例:
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzaha%2Fprepex.htm
编辑:根据您新发布的代码:
DBConnect db = new DBConnect();
db.open_Con();
ResultSet rs = db.get_data();
db.close_Con();
您在获取行后立即关闭连接,这会关闭您的ResultSet并刷新您的数据。
迭代数据,然后调用db.close_Con()
。
真正想要的是对此的看法:
CustomDataContainer data = new CustomDataContainer();
Connection conn = null;
PreparedStatement prep = null;
ResultSet rs = null;
try {
conn = getConnection(); // method returns a connection to your DB
prep = conn.prepareStatement(STRING_REPRESENTING_YOUR_STATEMENT);
rs = prep.executeQuery();
while (rs.next()) {
data.addData(rs.getString(1));
}
} catch (Exception ex) {
ex.printStackTrace();
// re-throw ex
} finally {
try { rs.close(); } catch (Exception ignore) {}
try { prep.close(); } catch (Exception ignore) {}
try { conn.close(); } catch (Exception ignore) {}
}
return data;