2012-04-17 5 views
1

Я новичок в Java и работаю над проектом. Я пытаюсь получить данные из MS Access с использованием Netbeans. Все это работало нормально, пока я не переустановил свою операционную систему. Теперь, когда я запускаю код, я получаю эту ошибку. Ваша помощь и советы были бы оцененыДанные не найдены 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

+0

Спасибо за ответ, я включил код – JohnO

+0

вы проверили, чтобы убедиться, что ваше соединение открыто? – ChadNC

ответ

0

Мое предположение, что кто-то создал источник данных ODBC на старом компьютере, и вы не создали его на новой машине.

Go здесь:

Панель управления -> Система & Security -> Администрирование -> Источники данных (ODBC)

+0

Привет, я создал два источника данных ODBC, и я уверен, что они точно такие же ... Я честно не уверен, почему я получаю ошибки и новичок во всем этом, конечно, не помогает, но спасибо – JohnO

+0

DataSources are расположенный в «Панель управления» -> «Администрирование» -> «Источники данных» – Lion

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

+0

В опубликованном коде вы ничего не читаете. Может быть, есть еще код, который вы должны проверить. Проверьте каждого получателя, который вы вызываете на объектах ResultSet. –

+0

Спасибо @Andre Я читаю первое имя и пароль из базы данных доступа – JohnO

2

Это не является центральным для вашей проблемы, но эта линия

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); 
} 

Таким образом, пользователи с именами или пароли, как "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

+0

Нет, он не исправит вашу проблему с «отсутствием данных», но я немного ее написал, чтобы показать вам, какую проблему безопасности он будет _prevent_. –

Смежные вопросы