2012-04-17 104 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