2012-04-17 105 views
1

我是Java新手,正在開發一個項目。我正在嘗試使用Netbeans從MS Access中檢索數據。這一切工作正常,直到我重新安裝我的操作系統。現在,我運行代碼,我得到這個錯誤。您的幫助和建議,將不勝感激找不到數據Java exception

java.sql.SQLException: No data found 
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7138) 
    at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073) 
    at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323) 
    at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174) 
    at java.sql.DriverManager.getConnection(DriverManager.java:582) 
    at java.sql.DriverManager.getConnection(DriverManager.java:185) 
    at connect.ConnectDB(connect.java:24) 
    at StaffLogin.formWindowOpened(StaffLogin.java:125) 
    at StaffLogin.access$000(StaffLogin.java:13) 
    at StaffLogin$1.windowOpened(StaffLogin.java:47) 
    at java.awt.Window.processWindowEvent(Window.java:1859) 
    at javax.swing.JFrame.processWindowEvent(JFrame.java:279) 
    at java.awt.Window.processEvent(Window.java:1820) 
    at java.awt.Component.dispatchEventImpl(Component.java:4630) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Window.dispatchEventImpl(Window.java:2475) 
    at java.awt.Component.dispatchEvent(Component.java:4460) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

這是代碼,我已經離開了「生成代碼」和「外觀和感覺」也。請讓我知道是否需要這些。謝謝。

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

public class StaffLogin extends javax.swing.JFrame { 

Connection conn = null; 
ResultSet rs = null; 
PreparedStatement pst = null; 

/** 
* Creates new form StaffLogin 
*/ 
public StaffLogin() { 
    initComponents(); 
} 
    private void formWindowOpened(java.awt.event.WindowEvent evt) {         
    // TODO add your handling code here: 
    conn = connect.ConnectDB(); 
}         

private void cmdloginMouseClicked(java.awt.event.MouseEvent evt) {          
    // TODO add your handling code here: 
    conn = connect.ConnectDB(); 
    String u = txtusername.getText(); 
    String p = txtpassword.getText(); 

    String sql = "SELECT * FROM Staff_Table WHERE Firstname='" + u+"' and Password='"+ p+"'"; 
    try{ 
     pst = conn.prepareStatement(sql); 
     rs = pst.executeQuery(); 
     if (rs.next()){ 
      JOptionPane.showMessageDialog(null,"Correct Password"); 
      Interface i = new Interface(); 
      i.setVisible(true); 

     } 
     else 
      JOptionPane.showMessageDialog(null,"Invalid Username or Password"); 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 
}          

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
      new StaffLogin().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
private javax.swing.JButton cmdlogin; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JLabel jLabel2; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPasswordField txtpassword; 
private javax.swing.JTextField txtusername; 
// End of variables declaration     

}

+0

發佈您的代碼並查看您的數據庫,並確保您的Windows安裝後數據仍然存在。 – apesa 2012-04-17 19:28:21

+0

感謝您的回覆,我已經包含了代碼 – JohnO 2012-04-17 19:33:58

+0

您是否檢查過以確保您的連接是開放的? – ChadNC 2012-04-17 19:45:16

回答

0

我最好的猜測是,其他人創建ODBC數據源舊機器上,並且您尚未創建它的新機器上。

去這裏:

控制面板 - >系統&安全 - >管理工具 - >數據源(ODBC)

+0

嗨,我創建了兩個ODBC數據源,我很確定他們是完全一樣的...我老實說不知道爲什麼我得到的錯誤,並且對所有這些都是新的,當然不會幫助,但是謝謝 – JohnO 2012-04-17 19:40:35

+0

DataSources是位於'控制面板 - >管理工具 - >數據源' – Lion 2012-04-17 19:41:14

5

這通常當您嘗試讀取列多次的價值發生。例如,這可能會引發 「找不到數據」:

ResultSet rs = statement.executeQuery(sql); 
while (rs.next()) { 
    if ("value1".equals(rs.getString("mycolumn")) || "value2".equals(rs.getString("mycolumn"))) { 

這樣,它工作得很好:

ResultSet rs = statement.executeQuery(sql); 
while (rs.next()) { 
    String value = rs.getString("mycolumn"); 
    if ("value1".equals(value) || "value2".equals(value)) { 
+0

嗨,我試圖找出我試圖檢索什麼數據,到目前爲止我所遇到的是用戶名和密碼。我將這些變成了變量,但仍然有相同的錯誤。我現在已經包含了代碼......你能幫我看看我試圖從發佈的代碼中檢索多個列的值嗎? – JohnO 2012-04-17 19:35:27

+0

在發佈的代碼中,您根本沒有閱讀任何列。也許你應該檢查更多的代碼。檢查您在ResultSet對象上調用的每個getter。 – 2012-04-17 19:41:00

+0

謝謝@Andre我正在讀取訪問數據庫中的名字和密碼 – JohnO 2012-04-17 19:52:59

2

這不是中央對你的問題,但此行

String sql = "SELECT * FROM Staff_Table WHERE Firstname='" + u+"' and Password='"+ p+"'"; 

是一個重大的安全漏洞。即使您使用的是「PreparedStatement」,但由於您是使用參數傳遞值構建字符串的「文本」,因此您正在設置自己的SQL注入攻擊。

而是做

String sql = "SELECT * FROM Staff_Table WHERE Firstname=? and Password=?" 
try{ 
    pst = conn.prepareStatement(sql); 
    pst.setString(1, u); 
    pst.setString(2, p); 
    rs = pst.executeQuery(); 
    if (rs.next()){ 
     JOptionPane.showMessageDialog(null,"Correct Password"); 
     Interface i = new Interface(); 
     i.setVisible(true); 

    } 
    else 
     JOptionPane.showMessageDialog(null,"Invalid Username or Password"); 
} 
catch(Exception e){ 
    JOptionPane.showMessageDialog(null, e); 
} 

這樣,用戶名或密碼像"Robert'; DROP TABLE Staff_Table; --"不會在未來成爲一個噩夢。

如果您不明白爲什麼這是一個問題,請考慮上述「Robert ...」用戶存在的情況。

String u = "Robert'; DROP TABLE Staff_Table; --"; 
String p = "haha"; 
String sql = "SELECT * FROM Staff_Table WHERE Firstname='" + u+"' and Password='"+ p+"'"; 

成爲

String sql = "SELECT * FROM Staff_Table WHERE Firstname='" 
    + "Robert'; DROP TABLE Staff_Table; --" 
    + "' and Password='"+ p+"'"; 

或者乾脆

String sql = "SELECT * FROM Staff_Table WHERE Firstname='Robert'; DROP TABLE Staff_Table; --' and Password='haha'; 

它被作爲複合SQL語句的執行,由三個SQL語句

SELECT * FROM Staff_Table WHERE Firstname='Robert'; 
DROP TABLE Staff_Table; 
--' and Password='haha'; 

的(注意最後行是一個SQL註釋,因爲它從--開始)。

+0

謝謝... @ Edwin – JohnO 2012-04-17 19:47:49

+0

不,它不會修復你的「找不到數據」的問題,但是我寫了一點來告訴你它會有什麼安全問題_prevent_。 – 2012-04-17 19:53:04