0

MS Access DB に対して認証 JFrame を作成しようとしていますが、クエリが正しく動作していないようです。アイデアは、ログインとパスワードを入力し、それらのいずれかが正しくない場合にメッセージを受け取ることです。私のコードは常に私を例外に送ります。これが私のコードです。誰かが私を助けてくれるかもしれません。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class First {

    JFrame frame;
    JPanel txt, but;
    JButton log, ext;
    JTextField login;
    JLabel l, p;
    JPasswordField pass;
    PreparedStatement prepst;
    ResultSet res;

    public First() {
        frame = new JFrame("Authorization");
        txt = new JPanel();
        but = new JPanel();
        log = new JButton("Login");
        ext = new JButton("Quit");
        login = new JTextField(10);
        l = new JLabel("Login:");
        p = new JLabel("Password:");
        pass = new JPasswordField(10);
        frame.setSize(400,100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        txt.add(l);
        txt.add(login);
        txt.add(p);
        txt.add(pass);
        frame.add(txt,BorderLayout.NORTH);
        but.add(log);
        but.add(ext);
        frame.add(but,BorderLayout.SOUTH);
        log.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evnt) {
                try {
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                    String PathToDataBase = "D:/workspace2/MicrosoftAccessConnection/db";
                String DataBase = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
                DataBase += PathToDataBase.trim() + ";DriverID=22;READONLY=true}";
                Connection con = DriverManager.getConnection(DataBase,"","");
                prepst = con.prepareStatement("SELECT * FROM USERS WHERE LOGIN= AND PASSWORD=?");
                String lll = login.getText();
                String ppp = pass.getText();
                prepst.setString(1,lll);
                prepst.setString(2, ppp);
                res = prepst.executeQuery();
                if((test(con,lll,ppp)) == true) {
                    while(res.next()) {
                        if((lll.equals(res.getString("LOGIN"))) && (ppp.equals(res.getString("PASSWORD")))) {
                            lol();
                        } else {
                            JOptionPane.showMessageDialog(null, "Wrong data");
                        }
                    }
                }
                res.close();
                prepst.close();
                con.close();
            } catch(Exception e) {
                JOptionPane.showMessageDialog(null, "Error with connection");
            }
        }
    });
    ext.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evnt) {
            frame.dispose();
        }
    });
    frame.setVisible(true);
}
public void lol() {
    JFrame f = new JFrame("SUCCESS");
    f.setSize(200,200);
    frame.dispose();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}

boolean test(Connection con, String login, String pass) throws SQLException {
    int rez = 0;
    PreparedStatement st = con.prepareStatement("SELECT COUNT(*) FROM USERS WHERE LOGIN=? AND PASSWORD=?");
    st.setString(1, login);
    st.setString(2, pass);
    ResultSet res = st.executeQuery();
    while (res.next()) {
        rez = res.getInt(1);
    }
    st.close();
    return rez == 1;
}

public static void main(String[] args) {
    new First();
}
}
4

1 に答える 1

2

PreparedStatementプレースホルダー文字がありませんSQL、置換

SELECT * FROM USERS WHERE LOGIN= AND PASSWORD=?

SELECT * FROM USERS WHERE LOGIN=? AND PASSWORD=?
                                ^

を取得している場合は、例外コンテンツを表示Exceptionするのが常に最善です。これを例外ブロックに追加できます。

e.printStackTrace();
于 2013-03-08T11:45:57.067 に答える