Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα. Στον παρακατω κωδικα λαμβανω ενα error "Illegal operation on empty result set" στην εντολη 

int keys = rs1.getInt(1)

;

Προσπαθω απο μια βαση δεδομενων να παρω το id του πινακα ωστε να τον κανω απο το προγραμμα Auto-Increment και να μην εχω μετρητη. Δεν εχω καταλαβει ομως γιατι λεει οτι το ResultSet μου ειναι αδειο.

 

 

 

try
{    // To conn_pr1 ειναι για το PreparedStatement
   Connection conn_pr1 = DriverManager.getConnection("jdbc:mysql://localhost/test1?user=me&password=12345");
    //  Το conn1 ειναι για το ResultSet.
   Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost/test1?user=me&password=12345");
Statement stmt1 = conn1.createStatement();
   // Εμφανιση της ανανεωμενης λιστας μετα
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM teams");
String sql1 = "INSERT INTO teams VALUES (?,?,?,?,?)";
PreparedStatement ps1 = conn_pr1.prepareStatement(sql1,Statement.RETURN_GENERATED_KEYS);
           String str1 = JOptionPane.showInputDialog(null,"Team name : ");
           String str2 = JOptionPane.showInputDialog(null,"Players : ");
           String str3 = JOptionPane.showInputDialog(null,"Points : ");
           String str4 = JOptionPane.showInputDialog(null,"Position : ");
       // Μετατροπη των String players,points,posisiton σε ακεραιους
           int int2 = Integer.parseInt(str2);
           int int3 = Integer.parseInt(str3);
           int int4 = Integer.parseInt(str4);
           rs1 = ps1.getGeneratedKeys();
       // Εδω εχω το προβλημα
           int keys = rs1.getInt(1);
           keys++;
           ps1.setInt(1,keys);
           ps1.setString(2,str1);
           ps1.setLong(3,int2);
           ps1.setLong(4,int3);
           ps1.setLong(5,int4);
           ps1.executeUpdate();
           System.out.println("\n Successfully added " + str1 + " to database test1!");
           System.out.println("\n After Changes : ");
   System.out.println("___________________________________________________________________________________");
      while (rs1.next())
      {
               
System.out.println(" Id : " + rs1.getString(1) + " | Team : " + rs1.getString(2) + " | Players : " + rs1.getString(3) + " | Points : " + rs1.getString(4) + " | Position : " + rs1.getString(5));
      }
          
           conn_pr1.close();
           ps1.close();
           rs1.close();
           stmt1.close();
           conn1.close();
          
} catch ( SQLException se)
{
se.printStackTrace();
       }
}
});
Δημοσ.

Μετα ομως θα πρεπει να μπουν πιο κατω και τα 

rs1 = ps1.getGeneratedKeys();
keys++;

και τοτε πως θα δωσω τιμη στο πρωτο field του VALUES που ειναι το keys, δηλαδη το id ? Δεν θα το αναγνωριζει στο 

ps1.setInt(1,keys);

Θελω πρωτα να γινουν οι αλλαγες με το PreparedStatement και μετα με το executeQuery να εμφανιστουν.

Δημοσ.

Γιατι με JDBC μου ειπαν να το κανω


Ουτε και ξερω hibernate ακομα.....στην αρχη ειμαι


Δοκιμασα και το εξης αλλα παλι τζιφος

 

 
while (rs1.next())
      {
       rs1 = ps1.getGeneratedKeys();
       int keys = rs1.getInt(1);    
       keys++;
       ps1.setInt(1,keys);
       ps1.setString(2,str1);
       ps1.setLong(3,int2);
       ps1.setLong(4,int3);
       ps1.setLong(5,int4);
       System.out.println(" Id : " + rs1.getString(1) + " | Team : " + rs1.getString(2) + " | Players : " + rs1.getString(3) + " | Points : " + rs1.getString(4) + " | Position : " + rs1.getString(5));
      }
   ps1.executeUpdate();
Δημοσ.
  Στις 25/7/2014 στις 8:31 ΠΜ, vagg77 είπε

 

και τοτε πως θα δωσω τιμη στο πρωτο field του VALUES που ειναι το keys, δηλαδη το id ? Δεν θα το αναγνωριζει στο 
ps1.setInt(1,keys);

Θελω πρωτα να γινουν οι αλλαγες με το PreparedStatement και μετα με το executeQuery να εμφανιστουν.

 

 

αν και δεν μπορώ να κάνω δοκιμές τώρα, γιατι δεν παίρνεις όπως είπε ο zynif το keys μέσα στο while και μετά να το δώσεις στο executeQuery κατευθείαν χωρίς όλα τα προηγούμενα... αν με το "δεν θα το αναγνωρίζει" εννοείς οτι θα χαθεί μόλις κλεισει το while, τότε απλά πρέπει να δηλώσεις το int keys εξω απο το while.

Δημοσ.

Οκ επιτελους καταφερα να λυσω το προβλημα. Tωρα μου εγραψε οτι πηγε να βαλει το στοιχειο στην θεση 1 και δεν μπορουσε γιατι το id = 1 το εχει αλλος. Πως θα επιστρεφω το μεγεθος της βασης και θα του λεω να το βαλει στο μεγεθος + 1;

 

Δεν υποτιθεται οτι η μεθοδος θα το εβρισκε απο μονη της;

Δημοσ.

βγάλε το ResultSet rs1 = ps1.getGeneratedKeys(); γιατι το θέλεις? δεν εχω καταλάβει....

και κράτα το ResultSet rs1 = stmt1.executeQuery("SELECT * FROM teams");

 

σε αυτο το select δεν σου επιστρεφει το id που θέλεις? το παίρνεις με getInt() μέσα στο while, το σώζεις στο keys, το αυξάνεις, και το κάνεις set στο preparedStatement ...

 

 

αν και αμφιβάλω αν χρειάζεσαι κάτι τέτοιο... αν εχω καταλάβει καλά αυτο που προσπαθείς να κάνεις, καλύτερα να βάλεις στην mysql ενα auto-increment για το id, να κάνεις κατευθείαν το insert χωρίς το id(η με NULL), και μετά να κάνεις ενα select last_insert_id(); για να βρείς το τελευταίο id... τόσο απλά.

 

 

edit: μήπως το πρόβλημα είναι απο την αρχή οτι δεν εχεις δηλώσει στην βάση το auto-increment στο id γιαυτο δεν σου δουλεύει ο κώδικας? δεν μπορώ να τον τεστάρω κιόλας τώρα.. οπότε πειραματίσου λίγο :P

  • Like 1
Δημοσ.

Για να βρεις το πλήθος των rows ενός πίνακα, μπορείς -υπό προυποθέσεις- να τρέξεις ένα query του στυλ:

SELECT COUNT(*) FROM table

Πάντως, θεωρώ κακή τακτική (δε μπορώ να σκεφτώ κάποιον καλό λόγο για να το κάνεις) το να μη χρησιμοποιήσεις το auto-increment που σου δίνει ήδη η MySQL.

 

edit: Δηλαδή, αυτό που σου αναφέρει ο Luciddream στην τελευταία παράγραφο του μηνύματός του.

  • Like 1
Δημοσ.

Στην δομη μου που εχω το εχω δηλωσει ως auto-increment και ως primary το id. Αλλα δεν ημουν σιγουρος αν επρεπε να το δηλωσω και στον κωδικα σε JDBC. Μηπως δεν χρειαζεται και πολυ απλα στο VALUES(?,?,?,?,?) να βγαλω τη μεταβλητη id και να εχω 4 ? μεσα αντι για 5 ? ;

Αρχικα αυτο ειχα αλλα δεν ηξερα τι τιμη θα επαιρνε και αν θα αναγνωριζε το γεγονος οτι το εχω δηλωσει ως primary και auto-increment απο τη βαση.

Δημοσ.

ναι, η να το δώσεις σαν NULL. λογικα θα δουλέψει και το getGeneratedKeys() το οποίο απο ότι διαβάζω τώρα ίσως ειναι πιο σωστή λύση απο το select last_insert_id().. όπως σου χω πει και εγω μαθαίνω ακόμα οπότε μπορεί να πετάω καμια κοτσάνα που και που :P

 

  Αναφορά σε κείμενο

 

Using the MySQL-specific method call isn't portable, and issuing a SELECT to get the AUTO_INCREMENT key's value requires another round-trip to the database, which isn't as efficient as possible.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...