-1

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

   }
}
4

2 回答 2

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) {
        }
    }

}
于 2013-01-28T23:10:50.657 回答
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();

您在获得 rows 后立即关闭连接,这将关闭您的 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;
于 2013-01-28T22:38:37.397 回答