找不到Java异常的数据
我是Java新手,正在做一个项目。我正在尝试使用Netbeans从MS Access检索数据。在我重新安装操作系统之前,一切正常。现在我运行代码,我得到这个错误。非常感谢您的帮助和建议找不到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.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数据源,我非常确定它们完全相同。。。老实说,我不知道为什么我会出现这些错误,而且对所有这些都不熟悉当然也没有帮助,但感谢数据源位于控制面板->管理工具->数据源不,它不会解决您的“找不到数据”问题,但我写了一点,向您展示它可以防止什么安全问题。不,它不会解决您的问题“找不到数据”问题,但我写了一点,向您展示它将防止什么安全问题。