为什么我的JDBC调用没有返回任何内容?

时间:2013-01-28 22:37:24

标签: java jdbc

我可以连接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)
   {

   }
}

2 个答案:

答案 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;