Ошибка обработки набора результатов в коде сервлета - PullRequest
0 голосов
/ 05 января 2012

Я пишу код в сервлете для проверки входа в систему. Я не знаю, почему я получаю сообщение об ошибке типа java.sql.SQLException: No data found, если я не закомментировал строки String s4 = rs.getString(1) и out.println(s4), если я закомментировал эти строки, которые сделал не получить ошибку.

Почему я получаю такую ​​ошибку? Я не могу найти ответ.

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class login extends HttpServlet {

    Connection conn;
    Statement stmt;
    ResultSet rs;
    String s = "";

    public void init() {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conn = DriverManager.getConnection("Jdbc:Odbc:edsn");
            s = "Your information is connected ......";
        } catch (Exception e) {
            s = "Exception 1....." + e.getMessage();
        }
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        res.setContentType("text/html;charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println(s);
        try {

            String ID = req.getParameter("T1");
            String query = "select * from user_db ";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(query);
            out.println("user" + " " + "pass");
            while (rs.next()) {

                try {
                    if ((rs.getString(1)).equals(ID)) {
                        String s4 = rs.getString(1);
                        out.println(s4);

                        out.println("<html><body><h> login Pass.....:(</h></body></html>");

                    }

                } catch (Exception e) {
                    out.println(e);
                }
            }

        } catch (Exception e) {
            out.println("Unable To Show the info... . . ." + e.getMessage());
        }

    }
}

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Зачем писать такой код? Это очень расточительно обходить весь стол ... IO один ... Почему бы не перейти на это:

ResultSet rs = null;
PreparedStatement st = null;
try {...
String ID = req.getParameter("T1"); 
            String query = "select 1 from user_db where col_name = ?"; 
            st = conn.prepareStatement(query);
            st.setString(1, ID);  
            rs = st.executeQuery();
if (rs.next()) {
  out.println(ID); 
  out.println("<html><body><h> login Pass.....:(</h></body></html>"); 
}
..

} finally {
if (rs != null) try { rs.close();}catch (Exception e) {}
if (st != null) try { st.close();}catch (Exception e) {}
}

подготовленные уведомления кешируются и лучше для частого использования

вы позволяете БД делать то, что хорошо - ищите данные

выбор 1 вместо выбора * не возвращает данные, которые вам на самом деле не нужны

jdbc работает тем больше, чем больше столбцов и данных в целом вы возвращаете, так что получите только то, что необходимо

и добавьте блок finally, чтобы всегда правильно закрывать соединения с БД

0 голосов
/ 06 января 2012

Вызов методов в Connection, Statement или ResultSet зависит от того, какой драйвер JDBC вы загрузили.Все значения ResultSet могут быть установлены, как только будет выполнен запрос, или они могут быть извлечены из базы данных по мере необходимости, в зависимости от реализации драйвера.

JdbcOdbcDriver выдает исключение SQLExceptionпосле вызова getString во второй раз.Это можно обойти, сохранив значения в строках вместо нескольких вызовов или переключившись на другой драйвер.

...