2016-08-08 92 views
0

Ich verwende Netbeans, neben SQLite für mein DBMS. Seltsamerweise kann ich meiner Datenbank einen Datensatz hinzufügen, einen Datensatz löschen und alle Datensätze anzeigen, aber wenn ich versuche, einen Datensatz zu aktualisieren, passiert nichts, nicht einmal ein Fehler. Weiß jemand, was das Problem ist?JDBC-Update zeigt keine Fehler an, funktioniert aber nicht?

import java.sql.*; 
import java.util.Scanner; 

public class Example 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      Class.forName("org.sqlite.JDBC"); 
     } catch (Exception e) 
     { 
      System.out.println(e); 
     } 
     Connection c = null; 
     try 
     { 
      c = DriverManager.getConnection("jdbc:sqlite:Example.db"); 
     } 
     catch (SQLException s) 
     { 
      System.out.println(s); 
     } 
     String sql = "INSERT INTO Classmates VALUES (?,?,?,?,?)"; 
     String deleteSQL = "DELETE FROM Classmates WHERE cid = ?"; 
     String updateSQL = "UPDATE Classmates SET firstname=?,lastname=?,age=?,gpa=? WHERE cid =?"; 
     String showSQL = "SELECT * FROM Classmates"; 

     int cid; 
     String firstname; 
     String lastname; 
     double age; 
     double gpa; 

     char selection; 
     boolean valid 

     Scanner in = new Scanner(System.in); 
     PreparedStatement p = null; 
     ResultSet r = null; 
     do 
     { 
      System.out.print("A -Add Classmate\n"); 
      System.out.print("R - Remove Classmate\n"); 
      System.out.print("S - Show all Classmates\n"); 
      System.out.print("U - Update a Classmate\n"); 
      System.out.print("Q - Quit\n"); 

      selection = in.next().charAt(0); 

      switch(selection) 
      { 
       case 'a': 
       case 'A': 
       case 'r': 
       case 'R': 
       case 's': 
       case 'S': 
       case 'u': 
       case 'U': 
       case 'q': 
       case 'Q': valid = true; 
        break; 
       default: valid = false; 
      } 
      switch(selection) 
      { 
       case 'a': 
       case 'A': 
        System.out.print("Enter cid: "); 
        cid = in.nextInt(); 
        in.skip("\n"); 
        System.out.print("Enter first name: "); 
        firstname = in.nextLine(); 
        System.out.print("Enter last name: "); 
        lastname = in.nextLine(); 
        System.out.print("Enter age: "); 
        age = in.nextDouble(); 
        System.out.print("Enter the gpa: "); 
        gpa = in.nextDouble(); 

        try 
        { 
         p = c.prepareStatement(sql); 
         p.clearParameters(); 
         p.setInt(1, cid); 
         p.setString(2, firstname); 
         p.setString(3, lastname); 
         p.setDouble(4, age); 
         p.setDouble(5, gpa); 
         p.executeUpdate(); 
        } 
        catch (SQLException s) 
        { 
         System.out.println(s); 
        } 
        break; 
       case 'r': 
       case 'R': 
        System.out.print("Enter cid: "); 
        cid = in.nextInt(); 
        try 
        { 
         p = c.prepareStatement(deleteSQL); 
         p.setInt(1, sid); 

         // execute SQL delete 
         p.executeUpdate(); 
        } 
        catch (SQLException s) 
        { 
         System.out.println(s); 
        } 
        break; 

       case 's': 
       case 'S': 
        try 
        { 
         p = c.prepareStatement(showSQL); 
         p.clearParameters(); 
         r = p.executeQuery(); 

         while(r.next()) 
         { 
          System.out.println("CID: " + r.getInt(1) + ", First Name: " 
           + r.getString(2) + ", Last Name: " + r.getString(3) 
           + ", Age: " + r.getDouble(4) + ", GPA: " + r.getDouble(5)); 
         } 
        } 
        catch (SQLException s) 
        { 
         System.out.println("Exception 4: " + s); 
        } 
        break; 
       case 'u': 
       case 'U': 
        System.out.print("Enter cid: "); 
        cid = in.nextInt(); 
        in.skip("\n"); 
        System.out.print("Update first name: "); 
        firstname = in.nextLine(); 
        System.out.print("Update last name: "); 
        lastname = in.nextLine(); 
        System.out.print("Update age of student: "); 
        age = in.nextDouble(); 
        System.out.print("Update GPA of student: "); 
        gpa = in.nextDouble(); 
        try 
        { 
         p = c.prepareStatement(updateSQL); 
         p.clearParameters(); 
         p.setInt(1, cid); 
         p.setString(2, firstname); 
         p.setString(3, lastname); 
         p.setDouble(4, age); 
         p.setDouble(5, gpa); 
         p.executeUpdate(); 
        } 
        catch (SQLException e) 
        { 
         System.out.println(e.getMessage()); 
        } 
        break; 
       case 'q': 
       case 'Q': 
        try 
        { 
         r.close(); 
         c.close(); 
        } 
        catch(SQLException s) 
        { 
         System.out.println("Exception 5: " + s); 
        } 
        break; 
       default: 
        System.out.println("Wrong Selection"); 
      } 
     }while (selection != 'q' || selection != 'Q'); 
    } 
} 
+0

'p.setInt (1, cid);' Entsprechend Ihrer Aktualisierungsabfrage ist der erste Parameter der fname – copeg

+0

Sie haben einen Konflikt zwischen Feldern und ihrer Position in der Abfrage. –

+2

Hier auf Stack Overflow ist es asozial Verhalten, Ihre Frage zu zerstören, nachdem Sie eine Antwort bekommen haben, die Ihnen geholfen hat. Ich habe deine letzte Bearbeitung zurückgesetzt. –

Antwort

2

Ihr Update-Code hat p.setInt(1, cid); aber das cid Feld zuletzt aufgelistet in der Aussage: String updateSQL = "UPDATE Classmates SET fname=?,lname=?,age=?,gpa=? WHERE sid =?";

+0

Das war ein Problem, so ein kleines Problem, aber es gelang mir, mich stundenlang festzuhalten. Vielen Dank! – compuman

0

Ihre WHERE versagt. Schauen Sie sich Ihre SQL:

UPDATE Classmates SET fname=?,lname=?,age=?,gpa=? WHERE sid =? 

dann

   p = c.prepareStatement(updateSQL); 
        p.clearParameters(); 
        p.setInt(1, cid); 
        p.setString(2, firstname); 
        p.setString(3, lastname); 
        p.setDouble(4, age); 
        p.setDouble(5, gpa); 
        p.executeUpdate(); 

Sie die Einstellung der cid Wert in der name und sid wird auf gpa.

Auch sollten Sie wirklich Ihre Verbindungen schließen. Betrachten Sie try-with-resources.