# Choicefeld mit SQL



## Brückenchiller (16. Jan 2012)

Moin,
habe eine Frage wie ich das Choicefeld mit einer SQL-Anfrage verbinde. So dass wenn ich 1 in Choicefeld wähle, das der Name von einer Person mit einer ID angezeigt wird z.B. 1 = Max Mustermann.
Habe mal ein Javacode-Ausschnitt eingefügt. Und ein Bild zum Verständnis, wie es Aussehen soll.



```
int countPersonID;
Choice chPersonID;
	public void chPersonID()
	{
			Statement stmt = null;
			ResultSet rs = null;

			try
			{
			stmt = (Statement) pConnect.getConnection().createStatement();
			rs = stmt.executeQuery("SELECT count(ID_Person) FROM tbl_Person");

            rs.next();

			countPersonID = rs.getInt(1);

			}
			catch (SQLException e)
			{}
			catch (NullPointerException e)
			{}
			chPersonID.add("Not Selected");
			for (int i=1;i<countPersonID + 1;i++)
			{
			chPersonID.add(Integer.toString(i));
			}
	}
```



mfg Brückenchiller


----------



## Michael... (16. Jan 2012)

Brückenchiller hat gesagt.:


> [JAVA=2]
> Choice chPersonID;
> public void chPersonID()[/code]


Grundsätzlich finde ich es ein bisschen unglücklich, wenn Methoden genauso wie Variablen heissen. Generell sollte man anhand des Namens einer Methode auch deren Zweck erkennen können.
catch Blöcke niemals leer lassen!! Mindestens 
	
	
	
	





```
e.printStackTrace();
```
 rein, wie soll man sonst evtl. Fehlerquellen finden.

Zur Frage: Sobald der Listener an der Choice Komponente reagiert, wird überprüft, ob ein gültiger Wert (z.B. SelectedIndex > 0) ausgewählt wurde. Anschließend wird mit diesem Wert (getSelectedItem) das Statement zusammengebaut (hier würde sich PreparedStatement empfehlen) und ausgeführt.


----------



## Brückenchiller (16. Jan 2012)

Moin,
Danke für die zwei Hinweise, wie ich das ordentlicher schreibe. 
Zu den PreparedStatement könntest du da mal ein Beispiel eventuell machen, denn ich weiß nicht, wie ich das gescheit schreiben soll. Weil ich damit noch nichts gemacht habe.


mfg Brückenchiller


----------



## Michael... (16. Jan 2012)

PreparedStatement einmalig definieren.

```
PreparedStatement stmt = con.prepareStatement("SELECT * FROM tbl_Person Where ID_Person = ?");
```
Und bei jeder Abfrage wieder verwenden:

```
stmt.setString/Int/OderWasAuchIDImmerFuerEinTypIst(1, chPersonID.getSelectedItem());
ResultSet rs = stmt.executeQuery();
```
Doku: PreparedStatement (Java Platform SE 6)


----------



## California (16. Jan 2012)

ResultSet.next ist boolean und sagt Dir, ob ein Satz da ist- also:


```
if (rs.next) {
        // Satz verarbeiten
    }
```

So hast du schon einen potentiellen Fehler weniger.

Warum deklarierst Du counttrallala global und gibst es nicht als Returnwert der Funktion zurück? Du brauchst es doch nur dort?
Globale Variable sind pfui, außer es sind richtige Datenfelder der Klasse. Zwischenergebnisse kann man immer z.B. als Funktionsergebnisse weitergeben.


----------

