2016-12-20 3 views
-1

Ich habe einige Probleme beim Abrufen des nächsten Datensatzes in meiner SQLite-Datenbank. Ich habe ausprobiert, um eine neue ArrayList und Instanz eines Mitarbeiters (eine Klasse mit Getters/Setter) jedoch habe ich noch Probleme. Ich habe die letzten eineinhalb Tage im Internet gesucht, um dieses Problem zu lösen. Ich habe versucht, mit if(rs.next)/while(rs.next) jedoch nur while scheint zu arbeiten. Ich habe Online geschaut und folgten mehrere Tutorials aber stoßen die Frage SQLITE TYPE_FORWARD_ONLY. ich umgesetzt haben:Java/JDBC/Swing - Probleme beim Abrufen des nächsten Datensatzes

ResultSet.TYPE_SCROLL_SENSITIVE, 
ResultSet.CONCUR_UPDATABLE 

Aber noch kein Glück, so entschied ich mich einen Iterator/Zähler als ID in meiner SQLite-Datenbank ist einzigartig hinzuzufügen. Das Problem scheint jedoch zu sein, dass der Iterator/Zähler nicht inkrementiert wird, wenn jedoch der Wert manuell gesetzt wird, d. H. 2, erhalte ich den zweiten Datensatz innerhalb der Datenbank und so weiter.

nextEmployee.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      // TODO Auto-generated method stub 
      Connection connection = null; 
      PreparedStatement pst = null; 
      Statement statement = null; 
      ResultSet rs = null; 
      int i = 1; 
      try {     
       Class.forName("org.sqlite.JDBC"); 
       connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
       connection.setAutoCommit(false);       

       String sql = "SELECT ID, Name, Gender, DOB, Address, Postcode, NIN, JobTitle, StartDate, Salary, Email from employees WHERE ID= " +(i);          

       pst = connection.prepareStatement(sql); 
       rs = pst.executeQuery();  

       for (i = 1; i <= 4; i++){ 
        while (rs.next()){ 

         String id = rs.getString(1); 
         String name = rs.getString(2); 
         String gender = rs.getString(3); 
         String dob = rs.getString(4); 
         String Address = rs.getString(5); 
         String Postcode = rs.getString(6); 
         String NIN = rs.getString(7); 
         String JobTitle = rs.getString(8); 
         String StartDate = rs.getString(9); 
         String Salary = rs.getString(10); 
         String email = rs.getString(11); 

         idTextField.setText(id); 
         nameTextField.setText(name); 
         genderTextField.setText(gender); 
         dobTextField.setText(dob); 

         addressTextField.setText(Address); 
         postcodeTextField.setText(Postcode); 
         ninTextField.setText(NIN); 
         jobtitleTextField.setText(JobTitle); 
         startdateTextField.setText(StartDate); 
         salaryTextField.setText(Salary); 
         emailTextField.setText(email); 


         // i++; 
         connection.commit(); 

         JOptionPane.showMessageDialog(null, "Employee has been found"); 
        } 
       }     

       rs.close(); 
       pst.close(); 
       connection.close(); 
      } 


      catch (Exception e1) { 

       JOptionPane.showMessageDialog(null, "No more records exist"); 

      } 
     }}); 

Ich habe gerade keine Ideen mehr. Dies ist das letzte Puzzleteil, das ich erfolgreich erstellt/einfügen, löschen, suchen, aktualisieren implementiert habe. Kann mir jemand sagen, warum dieser Iterator/Zähler nicht erhöht wird?

Vielen Dank.

EDIT -

Mitarbeiter Klasse

public class Employee extends Person { 
    private int id; 
    private float salary; 
    private String startDate; 
    private String title; 
    private String email; 



    public int getid(){ 
     return id; 
    } 

    public void setid(int id){ 
     this.id = id; 
    } 

    public float getsalary(){ 
     return salary; 
    } 

    public void setsalary(float salary){ 
     this.salary = salary; 
    } 

    public String getstartDate(){ 
     return startDate; 
    } 

    public void setstartDate(String startDate){ 
     this.startDate = startDate; 
    } 

    public String gettitle(){ 
     return title; 
    } 

    public void settitle(String title){ 
     this.title = title; 
    } 

    public String getemail(){ 
     return email; 
    } 

    public void setemial(String email){ 
     this.email = email; 
    } 



    public Employee(){ 
     this("", 'N', "", new Date(), "", "", 0, 0, "", "", ""); 
    } 

    public Employee(String Name, char Sex, String natIncsNumber, Date date, String address, String postcode, int ID, float Salary, String Startdate, String Title, String Email) { 
     super(Name, Sex,natIncsNumber, date, address, postcode); 
     this.id = ID; 
     salary = 0.0f; 
     this.startDate = Startdate; 
     this.title = Title; 
     this.email = Email; 
    } 


    public void setSalary(float salry){ 
     salary = salry; 
    } 

    public String toString(){ 
     return "Employee ID = " + id+ ", Employee Salary = " + salary + " Start Date = " + startDate + 
       " Title = " + title + " Email = " + email + super.toString(); 
    } 


} 

Person Class-

import java.io.*; 
public class Person implements Serializable{ 

    protected String name; 
    protected char gender; 
    protected String natIncsNo; 
    protected Date dob; 
    protected String Address; 
    protected String Postcode; 

    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public char getGender(){ 
     return gender; 
    } 

    public void setGender(char gender){ 
     this.gender = gender; 
    } 

    public String getnatIncsNo(){ 
     return natIncsNo; 
    } 

    public void setnatIncsNo(String natIncsNo){ 
     this.natIncsNo = natIncsNo; 
    } 

    public Date getdob(){ 
     return dob; 
    } 

    public void setdob(Date dob){ 
     this.dob = dob; 
    } 

    public String getAddress(){ 
     return Address; 
    } 

    public void setAddress(String Address){ 
     this.Address = Address; 
    } 

    public String getPostcode(){ 
     return Postcode; 
    } 

    public void setPostcode(String Postcode){ 
     this.Postcode = Postcode; 
    } 


    public Person(String Name, char Sex, String natIncsNumber, Date date, String address, String postcode) { 
     name = Name; 
     gender = Sex; 
     natIncsNo = natIncsNumber; 
     dob = date; 
     Address = address; 
     Postcode = postcode; 
    } 


     public Person(){ 
      this("", 'N', "", new Date(), "", ""); 
     } 

    public String toString(){ 



     String output = " Name: " + name + " Gender: " + gender + " National Insurance Number: " + natIncsNo + 
       " Date Of Birth : " + dob + 
       " Address: " + Address + " Postcode: " + Postcode; 

     return output; 

    } 
    } 

EDIT X 2-

EmployeeDAO Klasse

import java.security.spec.ECFieldF2m; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 

import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class EmployeeDAO extends Employee { 

    private Connection con; 
    private Statement st; 
    private ResultSet rs; 

    public EmployeeDAO() { 



     Connection connection = null; 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
     } catch (Exception e) { 
      System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      System.exit(0); 
     } 
     System.out.println("Connection - database driver found"); 




     //insertEmployeeAtID(); 
     //selectAllEmployees(); 
     //insertEmployee(); 
     //deleteEmployeeByID(); 
    } 





    public Statement getConnection() { 
     return st; 
    } 

    public void closeConnection() throws SQLException { 
     if (con != null) con.close(); 
    } 



    public ArrayList<Employee> selectAllEmployees(){ 
     Connection connection = null; 
     Statement statement = null; 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
      connection.setAutoCommit(false); 
      System.out.println("Read operation - database successfully opened"); 

      statement = connection.createStatement(); 
      ResultSet resultset = statement.executeQuery("SELECT * from employees"); 
      while (resultset.next()) { 
       int id = resultset.getInt("id"); 
       String name = resultset.getString("name"); 
       String email = resultset.getString("email"); 
       String gender = resultset.getString("gender"); 
       String dob = resultset.getString("dob"); 
       String Address = resultset.getString("address"); 
       String Postcode = resultset.getString("Postcode"); 
       String NIN = resultset.getString("NIN"); 
       String JobTitle = resultset.getString("JobTitle"); 
       String StartDate = resultset.getString("StartDate"); 
       String Salary = resultset.getString("Salary"); 


       System.out.println("ID : " + id); 
       System.out.println("Name : " + name); 
       System.out.println("Gender : " + gender); 
       System.out.println("Date Of Birth : " + dob); 
       System.out.println("Address : " + Address); 
       System.out.println("Postcode : " + Postcode); 
       System.out.println("National Insurance Number : " + NIN); 
       System.out.println("Job Title : " + JobTitle); 
       System.out.println("Start Date : " + StartDate); 
       System.out.println("Salary : " + Salary); 
       System.out.println("Email: " + email); 
       System.out.println(); 
      } 
      resultset.close(); 
      statement.close(); 
      connection.close(); 
     } catch (Exception e) { 
      System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      System.exit(0); 
     } 
     System.out.println("Read operation successfully done"); 
     return new ArrayList<Employee>(); 

    } 


    public String selectEmployeeByName() { 
     Connection connection = null; 
     Statement statement = null; 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
      connection.setAutoCommit(false); 
      System.out.println("Read operation - database successfully opened"); 

      statement = connection.createStatement(); 
      ResultSet resultset = statement.executeQuery("SELECT * from employees WHERE Name = 'Brad Stones';"); 
      while (resultset.next()) { 
       int id = resultset.getInt("id"); 
       String name = resultset.getString("name"); 
       String email = resultset.getString("email"); 
       String gender = resultset.getString("gender"); 
       String dob = resultset.getString("dob"); 
       String Address = resultset.getString("address"); 
       String Postcode = resultset.getString("Postcode"); 
       String NIN = resultset.getString("NIN"); 
       String JobTitle = resultset.getString("JobTitle"); 
       String StartDate = resultset.getString("StartDate"); 
       String Salary = resultset.getString("Salary"); 

       /* 
       System.out.println("ID : " + id); 
       System.out.println("Name : " + name); 
       System.out.println("Gender : " + gender); 
       System.out.println("Date Of Birth : " + dob); 
       System.out.println("Address : " + Address); 
       System.out.println("Postcode : " + Postcode); 
       System.out.println("National Insurance Number : " + NIN); 
       System.out.println("Job Title : " + JobTitle); 
       System.out.println("Start Date : " + StartDate); 
       System.out.println("Salary : " + Salary); 
       System.out.println("Email: " + email); 
       System.out.println(); 
       */ 
      } 
      resultset.close(); 
      statement.close(); 
      connection.close(); 
     } catch (Exception e) { 
      System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      System.exit(0); 
     } 
     System.out.println("Read operation successfully done"); 
      return toString(); 
    } 


    public boolean insertEmployee(){ 

     Connection connection = null; 
     Statement statement = null; 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
      connection.setAutoCommit(false); 
      System.out.println("Insert operation -database successfully opened"); 
      statement = connection.createStatement(); 
      String sql = "INSERT INTO employees (id, name, gender, NIN, dob, Address, Postcode,startDate, salary, email, JobTitle) " 
        + "VALUES ('1', 'Brad Stones', 'M', 'YU6593864T', '09-01-1987', '100 Dalton Road', 'M1 7TA', '09-01-1981','25000', '[email protected]', 'Tutor')"; 


      statement.executeUpdate(sql); 
      statement.close(); 
      connection.commit(); 
      connection.close(); 
     } catch (Exception e) { 
      System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      System.exit(0); 
     } 
     System.out.println("Records successfully created"); 
     return false; 
    } 




    public boolean insertEmployeeAtID(){ 

     Connection connection = null; 
     Statement statement = null; 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
      connection.setAutoCommit(false); 
      System.out.println("Update operation - database successfully opened"); 

      statement = connection.createStatement(); 
      String sql = "UPDATE employees set JobTitle = 'Potato' where ID=1;"; 
      statement.executeUpdate(sql); 
      connection.commit(); 
      statement.close(); 
      connection.close(); 
     } catch (Exception e) { 
      System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      System.exit(0); 
     } 
     System.out.println("Update operation successfully done"); 
     return false; 
     } 




    public boolean deleteEmployeeByID(){ 

     Connection connection = null; 
      Statement statement = null; 
      try { 
       Class.forName("org.sqlite.JDBC"); 
       connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
       connection.setAutoCommit(false); 
       System.out.println("Delete operation -database successfully opened"); 
       statement = connection.createStatement(); 
       String sql = "DELETE from employees where ID= 1"; 
       statement.executeUpdate(sql); 
       connection.commit(); 
       statement.close(); 
       connection.close(); 
      } catch (Exception e) { 
       System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
       System.exit(0); 
      } 
      System.out.println("Delete operation successfully done"); 
     return false; 
    } 

} 

nextEmployee Method-

List<Employee> list= empDAO.selectAllEmployees(); 

     int counter=0; 
     nextEmployee.addActionListener(new ActionListener() { 
      boolean isfirstTime = true; 


      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (isfirstTime) { 
        Connection connection = null; 
        PreparedStatement pst = null; 
        Statement statement = null; 
        ResultSet rs = null; 
        int i = 1; 
        try { 

         Class.forName("org.sqlite.JDBC"); 
         connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
         connection.setAutoCommit(false); 

         String sql = "SELECT ID, Name, Gender, DOB, Address, Postcode, NIN, JobTitle, StartDate, Salary, Email from employees WHERE ID= " 
           + (i); 

         pst = connection.prepareStatement(sql); 
         rs = pst.executeQuery(); 

         while(rs.next()){ 
          EmployeeDAO empDao=new EmployeeDAO(); 
          //set the variables for the employee 


          String id = rs.getString(1); 
          String name = rs.getString(2); 
          String gender = rs.getString(3); 
          String dob = rs.getString(4); 
          String Address = rs.getString(5); 
          String Postcode = rs.getString(6); 
          String NIN = rs.getString(7); 
          String JobTitle = rs.getString(8); 
          String StartDate = rs.getString(9); 
          String Salary = rs.getString(10); 
          String email = rs.getString(11); 

          idTextField.setText(id); 
          nameTextField.setText(name); 
          genderTextField.setText(gender); 
          dobTextField.setText(dob); 

          addressTextField.setText(Address); 
          postcodeTextField.setText(Postcode); 
          ninTextField.setText(NIN); 
          jobtitleTextField.setText(JobTitle); 
          startdateTextField.setText(StartDate); 
          salaryTextField.setText(Salary); 
          emailTextField.setText(email); 

          list.add(empDao); 


         } 


         rs.close(); 
         pst.close(); 
         connection.close(); 
        } 

        catch (Exception e1) { 

         JOptionPane.showMessageDialog(null, "No more records exist"); 

        } 
       }else{ 
        Employee emp=list.get(counter); 
        idTextField.setText(String.valueOf(emp.getid())); 
        //and so on. always get from emp 
        JOptionPane.showMessageDialog(null, "Employee has been found"); 


       } 
      } 
     }); 
+0

zu arbeiten bewegen 'Connection.commit();' 'vor Ihrer for' Schleife. – Berger

+0

@Berger Versucht es jedoch, da i = 1, gibt es nur den ersten Datensatz zurück und weigert sich nur, den Wert von i zu erhöhen. – TheNotoriousCoder

+0

Was ist der Zweck der 'for (i = 1; i <= 4; i ++)' Schleife? – Berger

Antwort

0

mit dem Code, den Sie für mich, krank Post Sie einige von mir Code ist zu viel geschrieben, wo ich eine dao-Klasse erstellt und wie kann ich es verwenden.

dao Klasse:

public class SchnitzelDBDAO { 

private static final Logger LOG = LoggerFactory.getLogger(SchnitzelDBDAO.class); 
private Properties dbProperties; 
private String action = ""; 
private Vector<Gericht> mealsActionPerformedOn; 

public SchnitzelDBDAO() { 
    dbProperties = new Properties(); 
    String stage = System.getProperty("stage", "prod"); 
    LOG.info("Loading stage properties: {} ", stage); 
    String file = stage + ".settings.txt"; 
    try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(file)) { 
     dbProperties.load(in); 
    } catch (Exception e) { 
     LOG.error("Properties konnten nicht geladen werden: ", e); 
     throw new RuntimeException(e); 
    } 
    mealsActionPerformedOn=new Vector<Gericht>(); 
} 

private Connection createConnection() throws Exception { 
    return DriverManager.getConnection(dbProperties.getProperty("server"), dbProperties); 
} 

public Vector<Gericht> findGericht(java.util.Date von, java.util.Date bis) throws Exception { 
    Vector<Gericht> v = new Vector<Gericht>(); 
    java.sql.Date[] dates = testDate(von, bis); 
    try (Connection connect = createConnection()) { 
     LOG.info("Searching for meals"); 
     String query = "select * from Gericht where date BETWEEN ? and ? order by date asc"; 
     PreparedStatement statement = connect.prepareStatement(query); 

     statement.setDate(1, dates[0]); 
     statement.setDate(2, dates[1]); 
     ResultSet rs = statement.executeQuery(); 
     while (rs.next()) { 
      Gericht g = new Gericht(); 
      g.setId(rs.getInt("id")); 
      String str = rs.getString("classification"); 
      g.setClassification(Classification.valueOf(str)); 
      g.setDate(rs.getDate("date")); 
      g.setName(rs.getString("name")); 
      g.setPreisExtern(rs.getBigDecimal("preisExtern")); 
      g.setPreisIntern(rs.getBigDecimal("preisIntern")); 
      v.add(g); 
     } 

     return v; 
    } 
} 
} 

dann es so in einem gewissen Klasse nennen. Die erste Zeile ist eine Membervariable in dieser Klasse.

SchnitzelDBDAO dbConnector = new SchnitzelDBDAO(); 
dbConnector.remove(gerichte.get(table.getSelectedRow()).getDate()); 

ich hoffe, dass Sie irgendwie Ihren Code Mine anpassen können und erhalten Sie Ihren Code richtig Versuchen

+0

Alter, Alter, Typ, Alter, Alter ... Ich liebe dich so sehr !!!!!!!! Aber nur ein kleines Problem, es zeigt immer wieder "Mitarbeiter wurde gefunden" an und wenn Sie OK wählen, geht es zum nächsten Mitarbeiter, wie kann ich das bekämpfen? Zuerst dachte ich aber einen Thread, der auch zeitbasiert ist. Ich brauche es nur, um zum nächsten Datensatz zu gelangen, sobald der Button angeklickt wird. – TheNotoriousCoder

+0

ahh na dann solltest du deinen Code wirklich anders strukturieren, damit du alle Mitarbeiter nur einmal durchliest und in einer Liste abspeichert und auf Knopfdruck einen Zähler erhöhst und den nächsten Mitarbeiter bekommst. Ich versuche, Ihnen eine mögliche Lösung zu geben – XtremeBaumer

+0

Ich habe versucht, so, aber immer wieder den Fehler mit SQLite Cursor - SQLITE TYPE_FORWARD_ONLY – TheNotoriousCoder

Verwandte Themen