Διάβασμα στοιχείων από mySQL με java - ResultSet

Συζητήσεις για την Java

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 02 Μάιος 2009 03:04

Καλημέρα,

έχω ένα πρόβλημα στη java, αφορά σύνδεση με mysql, και έχω κάνει και εκεί μια δημοσίευση. Το βάζω και εδώ όμως, μια και το πρόβλημα μάλλον είναι από τη μεριά της java.
http://www.freestuff.gr/forums/viewtopi ... 893#404893

Το θέμα είναι ότι έχω μια βάση, με την οποία συνδέομαι κανονικά και γράφω στοιχεία μέσα. Αυτό που θέλω είναι κάθε 1second να τραβάω έναν αριθμό από τη βάση, τον οποίο θα τον κάνω assign σε μία μεταβλητή μου. Τον αριθμό θα τον διαλέγω με το WHERE και θα βάζω και τα σχετικά φίλτρα. Το θέμα είναι ότι αυτά που κάνω select αποθηκεύονται στο ResultSet. Το ResultSet καθαρίζει μετά από κάθε select, ή κρατάει μέσα όλα τα select που έχω κάνει;

Υπάρχει κάποια συνάρτηση με την οποία να μπορώ να πάρω το πρώτο στοιχείο του ResultSet;

Ευχαριστώ προκαταβολικά.
Τελευταία επεξεργασία από το μέλος xarisss την 03 Μάιος 2009 15:22, έχει επεξεργασθεί 1 φορά συνολικά.
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 03 Μάιος 2009 01:25

με κάθε ResultSet.executeQuery("select....")
παίρνεις νέα στοιχεία κάθε φορά και τα προηγούμενα χάνονται

ResultSet.moveFirst()
σε πηγαίνει στην πρώτη εγγραφή

ResultSet.getString("surname")
παίρνεις την τιμή του πεδίου surname

περισσότερα εδώ
java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html

Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 03 Μάιος 2009 15:17

Καταρχήν ευχαριστώ για την απάντηση.

Το αποτέλεσμα του resultSet μπορώ να το κάνω assign κατευθείαν;

Δηλαδή

Κώδικας: Επιλογή όλων

ResultSet rs;
variable1=rs.executeQuery("select...");
Αυτό ισχύει;

Κάπου πρέπει να τα μπερδεύω με τα select και τα where. Γράφω δηλαδή αυτό:

Κώδικας: Επιλογή όλων

rs.executeQuery("SELECT column1 FROM `"+dbName+"`.`"+tableName+"`
			WHERE column2=2 AND column3=3 ORDER BY column4 DESC LIMIT 1" );
και ο compiler μου βγάζει λάθη. Μήπως πρέπει να το χωρίσω κάπως αλλιώς το WHERE και το ORDER;
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 03 Μάιος 2009 15:52

1)Το αποτέλεσμα του resultSet μπορώ να το κάνω assign κατευθείαν;
το αποτέλεσμα είναι ένας προσωρινός πίνακας τι να κάνεις assign?

Statement stmt1=......
ResultSet rs=null;
String variable1;
int variable2;
try{
rs=stmt1.executeQuery("select * from table1");
rs.moveFirst();
variable1=rs.getString("fieldname1");
variable2=rs.getString("id");
}catch(SQLException sql){
System.out.println("error:"+sql);
}
====================================

2)εκ παραδρομής έβαλα το executeQuery σαν μέθοδο του resultSet
ανήκει όμως στο statement δες πιο πανω

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 03 Μάιος 2009 16:36

διόρθωση

variable2=rs.getInt("id");

αντί

variable2=rs.getString("id");

Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 03 Μάιος 2009 20:51

Ας πούμε ότι κάνω το select μαζί με το where, κλπ. Έχω βάλει δηλαδή τα φίλτρα μου, με τα οποία τραβάω στοιχεία από μία στήλη. Από τα στοιχεία που θα μπουν στο resultSet (άλλη μία στήλη υποθέτω, αφού στον προσωρινό πίνακα έχω 1 στήλη), θα πάρω αυτό που βρίσκεται στην πρώτη γραμμή (αφού όπως είπαμε με κάθε select που κάνω μηδενίζεται το resultSet).

Επομένως, αυτό που θα τραβήξω γιατί να μην μπορώ να το κάνω assign;
Τη moveFirst δεν την έχει το online manual της Sun.

Δηλαδή πάμε σε κάτι τέτοιο:

Κώδικας: Επιλογή όλων

public void retrieveData()
{
Statement stmt1=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
ResultSet rs=null;
float variable;
try
{
rs=stmt1.executeQuery("SELECT column1 FROM `"+dbName+"`.`"+tableName+"`
         WHERE column2=2 AND column3=3 ORDER BY column4 DESC LIMIT 1");
rs.moveFirst();
variable=rs.getFloat("column1");
}
catch(SQLException sql)
{
System.out.println("error:"+sql);
}
}
 
Όπου columns, οι στήλες της mySQL. Τη σύνταξη του select με το where την έχω σωστή;
Τις συναρτήσεις του resultSet με το import java.sql.*; δεν τις εισάγουμε;
Μου χτυπάει ο compiler στη moveFirst().
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 03 Μάιος 2009 21:06

1) το import java.sql.*;
σαφώς και είναι απαραίτητο

2)
boolean first()
Moves the cursor to the first row in this ResultSet object.

first() αντι moveFirst()

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 03 Μάιος 2009 21:23

Τη σύνταξη του select με το where την έχω σωστή;
=======================================

βάλε σε μία System.out.println(......) τα περιχόμενα του
executeQuery(.....)

και δες αν με αυτήν την εντολή που τυπώνετε στην οθόνη ,
βάζοντας την στην mysql, παιρνεις το επιθυμητο αποτέλεσμα?
αν ναι τότε ειναι σωστό.

βάλε και μία System.out.println(""+variable);
είναι αυτό που περίμενες?
αν ναι τότε όλα καλά.

Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 04 Μάιος 2009 00:38

Ok, δούλεψε κανονικά αυτό. Στην απλή του μορφή (χωρίς μεταβλητές μέσα) λειτουργεί μια χαρά. Ευχαριστώ φίλε μου για τη μέχρι τώρα βοήθειά σου.

Κάτι άλλο τώρα, όσον αφορά το select και πάλι.
Βάζω ένα βρόχο for, ώστε να κάνω μια πολλαπλή επιλογή - στόχος μου τελικός είναι με αυτή την πολλαπλή επιλογή να γεμίζω ένα πίνακα, τώρα το δοκιμάζω με ένα απλό assign στη variable.

Γράφω:

Κώδικας: Επιλογή όλων

try
{
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

for&#40;int i=1;i<=4;i++&#41;
&#123;
rs = stmt.executeQuery&#40;"SELECT column1 FROM `"+dbName+"`.`"+tableName+"` WHERE column2=i AND column3=21 ORDER BY timestamp DESC LIMIT 1"&#41;;
rs.first&#40;&#41;;
variable = rs.getFloat&#40;"column1"&#41;;
System.out.println&#40;+ i + " = " + variable + "\n" &#41;;
&#125;
//τα υπόλοιπα ίδια
O compiler δεν έχει πρόβλημα με το i μέσα στο select. Το error είναι run-time.
Βγάζει:

Κώδικας: Επιλογή όλων

error&#58;com.mysql.jdbc.exceptions.MySQLSyntaxErrorException&#58; Unknown column 'i' in 'where clause'
Έπρεπε να το δηλώσω κάπως αλλιώς;

ΥΓ: Ξέρεις πώς μπορώ (και αν μπορώ) να τρέχω μία συνάρτηση κάθε 1 second (ή περίπου τόσο); Χρειάζεται interrupt; Δε θέλω να είμαι ακριβής στο second. Και 1.3 sec να γίνει δε με ενοχλεί.
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 04 Μάιος 2009 00:46

το i προφανώς είναι μεταβλητή

WHERE column2=i

να γίνει WHERE column2="+i+"

το λάθος στην εκτέλεση έρχεται από την mysql

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 04 Μάιος 2009 01:13

παράδειγμα κώδικα που εκτελείται κάθε 1 sec

Κώδικας: Επιλογή όλων

public class Test1 implements Runnable&#123;
	private int i;
	Thread runner;
	public Test1&#40;&#41;&#123;	
		i=0;
	  runner = new Thread&#40;this&#41;;
      runner.start&#40;&#41;;
	&#125;
	
	public static void main&#40;String &#91;&#93; args&#41;&#123;
		new Test1&#40;&#41;;
	&#125;
	public void run&#40;&#41;&#123;
		while &#40;runner!=null && i<15&#41;&#123;//εκτελείται μέχρι το i<15 αν βάλεις 1==1 θα       
                                                          //εκτελείται επ'άπειρο
            try&#123;
               Thread.sleep&#40;1000&#41;;//κάθε sec
            &#125;catch &#40;InterruptedException e&#41;&#123;
            &#125;
//αρχή
	System.out.println&#40;""+i+" sec"&#41;;//τι θα κάνω κάθε sec.Εδώ βάζεις τον κώδικα σου
		i++;
//τέλος
			&#125;
		
	&#125;
&#125;

Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 06 Μάιος 2009 01:35

Το +i+ το δοκίμασα, δουλεύει μια χαρά.
Το άλλο δεν πρόλαβα να το δοκιμάσω, γιατί έχω κολλήσει κάπου στον κώδικα σε runtime error. Όταν το δοκιμάσω θα σου πω.
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από virxen75 » 06 Μάιος 2009 01:42

γιατί έχω κολλήσει κάπου στον κώδικα σε runtime error.
τι μήνυμα λάθους σου βγάζει και που?

Άβαταρ μέλους
xarisss
Δημοσιεύσεις: 693
Εγγραφή: 06 Σεπ 2002 18:02
Τοποθεσία: Volos
Επικοινωνία:

Διάβασμα στοιχείων από mySQL με java - ResultSet

Δημοσίευση από xarisss » 06 Μάιος 2009 01:45

Δεν είναι στο δικό σου κώδικα. Στο δικό μου τα έχω μπερδέψει λίγο τα πράγματα απ' ότι βλέπω. Θα το δω αύριο και θα σου πω.
Ευχαριστώ πάντως για την ανταπόκριση.
PRO-PRO.gr
Πρωτάθλημα Προγνωστικών

Απάντηση

Επιστροφή στο “Java”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης