vagg77 Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 Καλησπερα. Στον παρακατω κωδικα λαμβανω ενα 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(); } } });
zynif Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 Νομίζω πρέπει να βάλεις το int keys = rs1.getInt(1); σέ ένα βρόχο while (rs1.next()) { } 2
vagg77 Δημοσ. 25 Ιουλίου 2014 Μέλος Δημοσ. 25 Ιουλίου 2014 Μετα ομως θα πρεπει να μπουν πιο κατω και τα rs1 = ps1.getGeneratedKeys(); keys++; και τοτε πως θα δωσω τιμη στο πρωτο field του VALUES που ειναι το keys, δηλαδη το id ? Δεν θα το αναγνωριζει στο ps1.setInt(1,keys); Θελω πρωτα να γινουν οι αλλαγες με το PreparedStatement και μετα με το executeQuery να εμφανιστουν.
vagg77 Δημοσ. 25 Ιουλίου 2014 Μέλος Δημοσ. 25 Ιουλίου 2014 Γιατι με 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();
Luciddream Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 Στις 25/7/2014 στις 8:31 ΠΜ, vagg77 είπε και τοτε πως θα δωσω τιμη στο πρωτο field του VALUES που ειναι το keys, δηλαδη το id ? Δεν θα το αναγνωριζει στο ps1.setInt(1,keys); Θελω πρωτα να γινουν οι αλλαγες με το PreparedStatement και μετα με το executeQuery να εμφανιστουν. αν και δεν μπορώ να κάνω δοκιμές τώρα, γιατι δεν παίρνεις όπως είπε ο zynif το keys μέσα στο while και μετά να το δώσεις στο executeQuery κατευθείαν χωρίς όλα τα προηγούμενα... αν με το "δεν θα το αναγνωρίζει" εννοείς οτι θα χαθεί μόλις κλεισει το while, τότε απλά πρέπει να δηλώσεις το int keys εξω απο το while.
vagg77 Δημοσ. 25 Ιουλίου 2014 Μέλος Δημοσ. 25 Ιουλίου 2014 Οκ επιτελους καταφερα να λυσω το προβλημα. Tωρα μου εγραψε οτι πηγε να βαλει το στοιχειο στην θεση 1 και δεν μπορουσε γιατι το id = 1 το εχει αλλος. Πως θα επιστρεφω το μεγεθος της βασης και θα του λεω να το βαλει στο μεγεθος + 1; Δεν υποτιθεται οτι η μεθοδος θα το εβρισκε απο μονη της;
Luciddream Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 βγάλε το 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 γιαυτο δεν σου δουλεύει ο κώδικας? δεν μπορώ να τον τεστάρω κιόλας τώρα.. οπότε πειραματίσου λίγο 1
StathisG Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 Για να βρεις το πλήθος των rows ενός πίνακα, μπορείς -υπό προυποθέσεις- να τρέξεις ένα query του στυλ: SELECT COUNT(*) FROM table Πάντως, θεωρώ κακή τακτική (δε μπορώ να σκεφτώ κάποιον καλό λόγο για να το κάνεις) το να μη χρησιμοποιήσεις το auto-increment που σου δίνει ήδη η MySQL. edit: Δηλαδή, αυτό που σου αναφέρει ο Luciddream στην τελευταία παράγραφο του μηνύματός του. 1
vagg77 Δημοσ. 25 Ιουλίου 2014 Μέλος Δημοσ. 25 Ιουλίου 2014 Στην δομη μου που εχω το εχω δηλωσει ως auto-increment και ως primary το id. Αλλα δεν ημουν σιγουρος αν επρεπε να το δηλωσω και στον κωδικα σε JDBC. Μηπως δεν χρειαζεται και πολυ απλα στο VALUES(?,?,?,?,?) να βγαλω τη μεταβλητη id και να εχω 4 ? μεσα αντι για 5 ? ; Αρχικα αυτο ειχα αλλα δεν ηξερα τι τιμη θα επαιρνε και αν θα αναγνωριζε το γεγονος οτι το εχω δηλωσει ως primary και auto-increment απο τη βαση.
Luciddream Δημοσ. 25 Ιουλίου 2014 Δημοσ. 25 Ιουλίου 2014 ναι, η να το δώσεις σαν NULL. λογικα θα δουλέψει και το getGeneratedKeys() το οποίο απο ότι διαβάζω τώρα ίσως ειναι πιο σωστή λύση απο το select last_insert_id().. όπως σου χω πει και εγω μαθαίνω ακόμα οπότε μπορεί να πετάω καμια κοτσάνα που και που Αναφορά σε κείμενο 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. 1
vagg77 Δημοσ. 25 Ιουλίου 2014 Μέλος Δημοσ. 25 Ιουλίου 2014 (επεξεργασμένο) Ok Επεξ/σία 28 Ιουλίου 2014 από vagg77
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα