Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
找不到Java异常的数据_Java_Sql_Ms Access_Netbeans - Fatal编程技术网

找不到Java异常的数据

找不到Java异常的数据,java,sql,ms-access,netbeans,Java,Sql,Ms Access,Netbeans,我是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新手,正在做一个项目。我正在尝试使用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                   

}

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

到这里:


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

我最好的猜测是,有人在您的旧计算机上创建了ODBC数据源,而您还没有在新计算机上创建它

到这里:


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

当您尝试多次读取列的值时,通常会发生这种情况。例如,这可能抛出“未找到数据”:

这样就可以很好地工作:

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

这通常在多次尝试读取列的值时发生。例如,这可能抛出“未找到数据”:

这样就可以很好地工作:

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

这不是你问题的核心,但这一行

String sql = "SELECT * FROM Staff_Table WHERE Firstname='" + u+"' and Password='"+ p+"'";
这是一个重大的安全漏洞。即使您“使用”
PreparedStatement
s,因为您是“文本”构建带有参数传递值的字符串,您也在为自己设置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);
}
这样的话,名字或密码像这样的用户就不会成为未来的噩梦

如果你不理解为什么这是一个问题,考虑上面提到的“罗伯特…”用户存在的场景。

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注释,因为它以
--
开头)。

这不是问题的核心,而是这一行

String sql = "SELECT * FROM Staff_Table WHERE Firstname='" + u+"' and Password='"+ p+"'";
这是一个重大的安全漏洞。即使您“使用”
PreparedStatement
s,因为您是“文本”构建带有参数传递值的字符串,您也在为自己设置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);
}
这样的话,名字或密码像这样的用户就不会成为未来的噩梦

如果你不理解为什么这是一个问题,考虑上面提到的“罗伯特…”用户存在的场景。

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注释,因为它以
--
)开头。

发布您的代码并查看数据库,确保在windows安装后数据仍然存在。感谢您的回复,我现在已经包含了代码。您是否检查了以确保连接已打开?您的
PrepareStatement pst=conn.PrepareStatement(SQL);在您的代码中没有任何价值看起来我们需要
initComponents()的代码
这似乎是建立连接的地方。发布您的代码并查看数据库,确保windows安装后数据仍然存在。感谢您的回复,我现在已经包含了代码。您是否检查了以确保连接已打开?您的
PrepareStatement pst=conn.PrepareStatement(sql)在您的代码中没有任何价值看起来我们需要
initComponents()
的代码,该代码似乎是建立连接的地方。您好,我试图找出我试图检索的数据,到目前为止,我遇到的只是用户名和密码。我将这些变量更改为变量,但仍然得到相同的错误。我已经包括代码现在。。。你能帮我看看我多次试图从发布的代码中检索的列值是什么吗?在发布的代码中,你根本看不到任何列。也许你应该检查更多的代码。检查您对ResultSet对象调用的每个getter。谢谢@Andre我正在从access数据库读取名字和密码错误似乎不在您发布的代码段中。请把代码贴在它连接到数据库的地方。嗨,我试图找出我试图检索的数据,到目前为止,我遇到的只是用户名和密码。我将这些变量更改为变量,但仍然得到相同的错误。我已经包括代码现在。。。你能帮我看看我多次试图从发布的代码中检索的列值是什么吗?在发布的代码中,你根本看不到任何列。也许你应该检查更多的代码。检查您对ResultSet对象调用的每个getter。谢谢@Andre我正在从access数据库读取名字和密码错误似乎不在您发布的代码段中。请把代码贴在它连接到DB的地方。嗨,我创建了两个ODBC数据源,我很确定它们完全相同。。。老实说,我不知道为什么我会出现这些错误,而且我对所有这些都是新手,这当然没有帮助,但感谢数据源位于
控制面板->管理工具->数据源
嗨,我创建了两个ODBC数据源,我非常确定它们完全相同。。。老实说,我不知道为什么我会出现这些错误,而且对所有这些都不熟悉当然也没有帮助,但感谢数据源位于
控制面板->管理工具->数据源
不,它不会解决您的“找不到数据”问题,但我写了一点,向您展示它可以防止什么安全问题。不,它不会解决您的问题“找不到数据”问题,但我写了一点,向您展示它将防止什么安全问题。