Как сделать зацикливание с ResultSet? - PullRequest
0 голосов
/ 28 января 2019

Итак, я хочу зациклить этот ResultSet для обновления таблицы один за другим, но метод while (rsl.next ()) не может помочь мне выполнить зацикливание.Это просто работа один раз, а затем другие пропускаются.Может кто-нибудь помочь мне решить эту проблему?Заранее спасибо

try {
    String url = "jdbc:mysql://localhost/minimarket";
    String user = "root";
    String pass = "";
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url, user, pass);
    Statement stmt = conn.createStatement();

    ResultSet rsl = stmt.executeQuery("SELECT * FROM keranjang WHERE pemesan='"+login.userid+"'");

    while (rsl.next()) {
        String nb = rsl.getString("nama_barang");
        String dtl = rsl.getString("detail");
        String beratt = rsl.getString("berat");
        String hrga = rsl.getString("harga");
        String jmlh = rsl.getString("jumlah");
        stmt.executeUpdate("UPDATE barang SET stok=stok+'"+jmlh+"' WHERE nama_barang='"+nb+"' AND detail='"+dtl+"' AND berat='"+beratt+"'");
        stmt.executeUpdate("DELETE FROM keranjang WHERE pemesan ='"+login.userid+"' AND nama_barang='"+nb+"'");
    }

    conn.close();
} catch (Exception error) {

}

System.exit(0);

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Если я правильно понял вашу проблему, здесь есть две возможные проблемы:

набор результатов равен нулю - я предполагаю, что это не может быть так, как если бы вы получили исключение в вашемЦикл while и ничего не выводится. Вторая проблема заключается в том, что resultset.getString (i ++) будет получать столбцы 1, 2, 3 и т. д. из каждой последующей строки. Я думаю, что вторая точка, вероятно, является вашей проблемой здесь.

Допустим, вы вернули только 1 строку, как показано ниже

Col 1, Col 2, Col3 
A   , B,    C

Ваш код в том виде, в каком он есть, получит только A - он не получит остальные столбцы.

IПредлагаем изменить код следующим образом:

ResultSet resultset = ...;
ArrayList<String> arrayList = new ArrayList<String>(); 
while (resultset.next()) {              
        int i = 1;
        while(i <= numberOfColumns) {
            arrayList.add(resultset.getString(i++));
        }
        System.out.println(resultset.getString("Col 1"));
        System.out.println(resultset.getString("Col 2"));
        System.out.println(resultset.getString("Col 3"));                    
        System.out.println(resultset.getString("Col n"));
}

Чтобы получить количество столбцов:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();
0 голосов
/ 28 января 2019

Когда вы выполняете executeUpdate в своем выражении, возвращается int и, что наиболее важно, ваш объект набора результатов rs1 из вашего запроса закрывается и больше не может быть доступен, так как класс Statement обрабатывает только один запрос /набор результатов.Я не проверял это сам, но я уверен, что это причина.

Решение состоит в том, чтобы иметь отдельный Statement объект для обновления / удаления, чтобы исходный ResultSet не затрагивался.Нечто вроде ниже

Statement stmt = conn.createStatement();
Statement updStmt = conn.createStatement();
ResultSet rsl = stmt.executeQuery("SELECT * FROM keranjang WHERE pemesan='"+login.userid+"'");

while (rsl.next()) {
    String nb = rsl.getString("nama_barang");
    String dtl = rsl.getString("detail");
    String beratt = rsl.getString("berat");
    String hrga = rsl.getString("harga");
    String jmlh = rsl.getString("jumlah");

    updStmt.executeUpdate("UPDATE barang SET stok=stok+'"+jmlh+"' WHERE nama_barang='"+nb+"' AND detail='"+dtl+"' AND berat='"+beratt+"'");
    updStmt.executeUpdate("DELETE FROM keranjang WHERE pemesan ='"+login.userid+"' AND nama_barang='"+nb+"'");
}
0 голосов
/ 28 января 2019

Проблема:

if (rsl.next())

fix:

while (rsl.next())

Отладка приложения и проверка правильности вашего соединения с базой данных.

...