# String[] in eine SQL-Anweisung implementieren



## java007 (13. Apr 2010)

Hallo Leute,

ich versuche die SQL-Abfrage in eine For-Schleife zu implementieren. Allerdings komme ich nicht drauf, wie ich das "String[] c" in die SQL-Abfrage implementieren kann. Ich mit + usw. versucht.

Vielen Dank 

[JAVA=42]

Strin a; // a wird aus einer anderen Klasse geliefert
String[] c = new String[]{"Raum1", "Raum2", "Raum3", "Raum4", "Raum5", "Raum6",};



 for(int t = a.length()-1; t>=0; t--  ){

                                         //c-Array !!!!!
 ResultSet rs = stmt.executeQuery("SELECT '+c[t]+' FROM Daten Where NR = '"+a+"' ");
 	  	   ResultSetMetaData rsmd = rs.getMetaData();
 	   		int clmCnt = rsmd.getColumnCount();
 	   	while (rs.next()) {
  			for (int i = 1; i <= clmCnt; i++) {

 				b = rs.getString(i);
			System.out.print(b);

  			}
  			System.out.println();

  		}
  		rs.close();
  		stmt.close();
  		con.close();}
[/code]


----------



## Foermchen82 (13. Apr 2010)

```
ResultSet rs = stmt.executeQuery("SELECT " +c[t]+ " FROM Daten Where NR = '"+a+"' ");
```

robiers mal


----------



## anonym (13. Apr 2010)

Also, im Moment erzeugt dein Code Queries der Form 

SELECT raum1 FROM Daten WHERE NR = 'a'; 

Probier mal mit einer mysql- GUI (z.B. phpmyadmin, MySQL- Administrator...) oder einem Kommandozeilen- Client diesen Queries auszufuehren und gucke, ob das das ist, was du willst. Wenn nicht, ueberlege, wie der Query aussehen soll, welche Stellen du wie ersetzen musst und baue das dann so zusammen. 

PS: Auf jeden Fall brauchen wir mal den Query, den du erzeugen willst um zu sagen, was falsch läuft.


----------



## java007 (14. Apr 2010)

Hallo Leute,
danke für eure Bemühung

@ Foermchen82
sobald ich deinen vorschlag ausführe, bekommen ich diese Fehlermeldung
The type of the expression must be an array type but it resolved to String


ich habe es leider bisher nicht hinbekommen, dürfte aber auch eigentlich nicht so schwer sein


----------



## SlaterB (14. Apr 2010)

diese Fehlermeldung bedeutet, dass c als String und nicht als String[] angesehen wird, 
mit obigen Code passt das nicht zusammen, der kompiliert wenn man ihn etwa grob zu folgenen kompletten Programm erweitert


```
public class Test {
    public static void main(String[] args) throws Exception {
        String[] c = new String[]
            {"Raum1", "Raum2", "Raum3", "Raum4", "Raum5", "Raum6",};

        Statement stmt = null;
        String a = null;
        for (int t = a.length() - 1; t >= 0; t--)  {
            // c-Array !!!!!
            ResultSet rs = stmt.executeQuery("SELECT " + c[t] + " FROM Daten Where NR = '" + a + "' ");
            ResultSetMetaData rsmd = rs.getMetaData();
            int clmCnt = rsmd.getColumnCount();
            while (rs.next())  {
                for (int i = 1; i <= clmCnt; i++)  {
                    String b = rs.getString(i);
                    System.out.print(b);
                }
                System.out.println();
            }
            rs.close();
            stmt.close();
            // con.close();
        }
    }
}
```

also: die Fehlermeldung tritt in deinem Code auf, der hier unbekannt ist...


----------



## java007 (14. Apr 2010)

ich teste mal sofort


----------



## SlaterB (14. Apr 2010)

eine merkwürdige allgemeine Fehlermeldung, bei google findet man dazu quasi nichts,

meine Taktik dann immer: zurück zu allen Anfängen, hast du überhaupt schon je eine Query erfolgreich ausgeführt im aktuellen Kontext?
vergiss alle Schleifen, Arrays, WHER-Bedingungen, Ergebnis-Auswertungen usw.
fange ganz einfach an:

- main-Methode
- Connection holen
- Statement
- Test-SQL: "SELECT * FROM Daten"

funktioniert das ja oder nein?
wenn nicht funktioniert irgendeine andere Tabelle, irgendeine andere Art von SQL?
wenn nicht hast du ein grundsätzliches Problem, JDBC-Treiber, Datenbank und so (welche?)

wenn doch, dann arbeite dich langsam hoch zu den Querys, die du benötigst,
falls sie in einem Programmteil gehen, im anderen nicht mehr, schaue nach ob zwischendurch die Connection oder das Statement mehrfach benutzt oder geschlossen wurde oder irgendein ähnlich geänderter Umstand

(edit: der Text 'SQLException: Invalid handle' wurde inzwischen entfernt  )


----------



## java007 (14. Apr 2010)

ich kriege leider diese Fehlermeldung 

Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
	at test.main(test.java:29)

so habe ich die treiber eingestellt

[Java=42]
Connection con;
		con = DriverManager
		.getConnection("jdbcdbcRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:/Dokumente und Einstellungen/XXXXX/Desktop/Daten.mdb");
		Statement stmt = con.createStatement(); // usw.......
[/Java]


----------



## SlaterB (14. Apr 2010)

hier
zugriff auf access-datenbank mit jsp oder java | aus Forum Java | wer-weiss-was
steht

"[Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
Hint: The cause of this error is usually that your query contains a reference to a field which does not exist. You should verify that the fields included in your query exist and that you have specified their names correctly."

bist du sicher mit den Felder-Namen?
wie gesagt erstmal ohne WHERE und mit SELECT * testen


edit:
was ist NR für ein Datentyp? eine Zahl mit Anführungszeichen ist sicher auch nicht so toll
http://www.java-forum.org/datenbankprogrammierung/21116-java-access-fehler-parameteruebergbe.html


----------



## java007 (14. Apr 2010)

Hallo SlaterB,

vielen dank für deine schnelle Antwort und deine Bemühung. Ich habe den Fehler mit dem Feld gefunden 
Allerdings wird nun nach der ersten Ausgabe die schleife abgebrochen  und zwar mit dieser Meldung
wäre echt super wenn du dafür auch ein Tipp hättest 


Exception in thread "main" java.sql.SQLException: Invalid handle
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
	at test.main(test.java:36)

Gruß,


----------



## SlaterB (14. Apr 2010)

zu Invalid Handle war ja meine Antwort von 10:39 gedacht,
wenn die erste Query geht, musst du vielleicht in der Schleife jeweils auch ein neues Statement-Objekt erzeugen


----------



## java007 (14. Apr 2010)

ich habe ganz unten 

rs.close()    rausgenommen und jetzt gehts 

vielen vielen Dank nochmals


----------



## SlaterB (14. Apr 2010)

rs.close() zu entfernen ist aber keine gute Idee, denn rs.close() für sich ist immer eine gute Idee,
wenn danach das Statement nicht mehr zu verwenden ist, dann close() auch das (zur Sicherheit)
und nimm ein neues Statement, 
das ist nun wirklich nicht so viel Arbeit und viel schöner

edit: stmt.close();
hattest du ja auch schon, ok dass könntest du verzögern bis auf nach der Schleife, 
wenn nur rs.close() innerhalb der Schleife zusammen mit einem Statement für die ganze Schleife hinkommt


----------



## java007 (14. Apr 2010)

Hallo SlaterB,

danke für die Infos 
ich habe mich vorhin falsch ausgedrückt 
rs.close() habe ich in eine tiefere Schleife verschoben und dann hats geklappt 

Viele Grüße


----------

