【问题标题】:No data found Java exception未找到数据 Java 异常
【发布时间】:2012-04-17 19:22:14
【问题描述】:

我是 Java 新手,正在从事一个项目。我正在尝试使用 Netbeans 从 MS Access 检索数据。在我重新安装操作系统之前一切正常。现在我运行代码我得到这个错误。非常感谢您的帮助和建议

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                   

}

【问题讨论】:

  • 发布您的代码并查看您的数据库,并确保您的 Windows 安装后数据仍然存在。
  • 感谢您的回复,我现在已包含代码
  • 您是否检查过以确保您的连接已打开?
  • 代码中的PrepareStatement pst = conn.prepareStatement(sql); 毫无价值
  • 看起来我们需要initComponents() 的代码,这似乎是建立连接的位置。

标签: java sql ms-access netbeans


【解决方案1】:

这通常发生在您尝试多次读取列的值时。例如,这可能会抛出“No data found”:

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)) {

【讨论】:

  • 嗨,我试图弄清楚我试图检索什么数据,到目前为止我遇到的只是用户名和密码。我将这些更改为变量,但仍然出现相同的错误。我现在已经包含了代码...你能帮我看看我试图从发布的代码中多次检索的列值吗?
  • 在发布的代码中,您根本没有阅读任何专栏。也许您应该检查更多代码。检查您在 ResultSet 对象上调用的每个 getter。
  • 谢谢@Andre 我正在从访问数据库中读取名字和密码
  • 该错误似乎不在您发布的 sn-p 中。请张贴连接到数据库的代码。
【解决方案2】:

这不是你的问题的核心,但这条线

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

是一个主要的安全漏洞。即使您正在“使用”PreparedStatements,因为您正在“文本”构建带有参数传递值的字符串,但您正在为 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 注释,因为它以 -- 开头)。

【讨论】:

  • 不,它不会解决您的“找不到数据”问题,但我写了一点,向您展示它将防止的安全问题。
【解决方案3】:

我的最佳猜测是其他人在您的旧机器上创建了 ODBC 数据源,而您还没有在新机器上创建它。

去这里:

控制面板 -> 系统和安全 -> 管理工具 -> 数据源 (ODBC)

【讨论】:

  • 嗨,我创建了两个 ODBC 数据源,我很确定它们是完全相同的......老实说,我不确定为什么我会收到错误并且对这一切都不熟悉'没有帮助,但谢谢
  • 数据源位于Control Panel -> Administrative Tools -> Data Sources
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 2015-06-23
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多