2013-03-08 72 views
0

我試圖做一個MS Access數據庫的授權JFrame,但查詢did'nt似乎沒有適當地wirk。這個想法是intup登錄名和密碼,如果其中一個不正確,請收到一條消息。我的代碼總是發送給我的例外。這是我的代碼,也許有人可以幫助我。與MS Access基地授權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(); 
} 
} 

回答

2

你從你的SQL缺少PreparedStatement佔位符,與

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

更換

SELECT * FROM USERS WHERE LOGIN= AND PASSWORD=? 

如果你得到一個Exception,它始終是最好的顯示 the exce ption內容。您可以將其添加到異常塊:

e.printStackTrace();