# ResultSet ist leer! Warum?



## spoona (25. Jun 2006)

Hallo,

ich habe gerade eine kleine Datenbankanbindung geschrieben.
Das ganze soll aus einer JSP-Datei heraus erfolgen.
Eine Verbindung zur Datenbank kann wohl hergestellt werden, aber wenn ich ein SQL-Statement abschicke
bekomme ich immer nur eine leere Menge zurück. 
Ich werde hier bald verrückt . Es stehen definitiv Daten in der DB und daher darf das Set auch nicht leer sein.
Vielleicht könnt ihr mir helfen: den folgende Code habe ich verwendet:

htmlCODE....
<%
  String sDbDrv = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  String sDbUrl = "jdbc:sqlserver://localhost:1433; DatabaseName=PIM_DB";
  String sUsr   = "chris";
  String sPwd   = "******";
     Connection cn = null;
     Class.forName( sDbDrv );
      cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
%>
htmlCODE...
<% 
           stmt=cn.createStatement();
            query="Select Test1 From Main";
            rs=stmt.executeQuery(query);%>

<option>
<%=rs.getString(1) %>
</option>            


Der Zugriff soll auf den "MSSQL Server 2005 Express" erfolgen.
Beim Ausführen des Codes taucht folgende Fehlermeldung auf:

javax.servlet.ServletException: Das ResultSet verfügt über keine aktuelle Zeile

Vielen Dank für Eure Hilfe
Gruß Chris


----------



## foobar (25. Jun 2006)

```
<option>
<%= if (rs.next()){ rs.getString(1)} %>
</option>
```

P.S. Es gibt kaum etwas schlimmeres als SQL in JSQP einzubetten.


----------



## AlArenal (25. Jun 2006)

Zur Erklärung:
Vor dem Auslesen des Resultsets musst du den Zeiger im Set aufs erste Element setzen.


----------



## spoona (25. Jun 2006)

Hallo,

also zunächst was meinst du damit :SQL in JSP einzubetten ist schlecht??

Ich habe jetzt weiteren Code hinzugefügt:


```
...     rs.first();%>
            
            <option>
            <%= if (rs.next()) {rs.getString(1);}%>
            </option>
```

so folgende Fehlermeldung bekomme ich nun.

javax.servlet.ServletException: Der angeforderte Vorgang wird für nur vorwärts gerichtete ResultSets nicht unterstützt.


Hilfe!!!!!


----------



## DP (25. Jun 2006)

mach mal while anstatt if


----------



## spoona (25. Jun 2006)

hmmm danke aber das ist es auch nicht

:-(


----------



## DP (25. Jun 2006)

was willst du damit erreichen:

rs.first();%


----------



## spoona (25. Jun 2006)

Naja weil AlArenal gesagt hat, dass ich den Zeiger im Set auf das erste Element setzen soll
Hmmm, verstehe das alles nicht. Warum geht das nicht?

Hat es mit der rechte Verwaltung auf dem SQL Server zu tun? Ich bekomme doch eine Verbindung über den Usernamen, also sollte ich doch auch Daten auslesen können?

Hmm


----------



## AlArenal (25. Jun 2006)

spoona hat gesagt.:
			
		

> Naja weil AlArenal gesagt hat, dass ich den Zeiger im Set auf das erste Element setzen soll



rs.next() erldigt das aber bereits. Nur hattest du in deinem ersten Code direkt nach der Ausführung des Statements versucht aufs ResultSet zuzugreifen.


----------



## spoona (25. Jun 2006)

ok ja klar hast du natürlich recht.


folgenden Code habe ich jetzt:

```
...
            stmt=cn.createStatement();
            query="Select Test1 From Main";
            rs=stmt.executeQuery(query);%>

                         
            <option>
              <% while (rs.next())              <----- kein      <%=
              {rs.getString(1);}
              %>
            </option>
```

so startet zumindet meine Seite, aber leider ist das Dropdown-Menu nicht gefüllt mit dem Wert aus der Datenbank.

wenn ich den JSP Tag durch <%= ersetze, bekomme ich folgende Fehlermeldung:
illegal start of expression
            while (rs.next())
            ^

wie kann ich dem Dropdown-Menu denn nun ein Wert zuweisen?
Hatte die Idee die While Bedingung vor OptionTag in ein weiteres Tag zu packen, leider komme ich da mit den Klammern und den Tags durcheinander.


----------



## DP (25. Jun 2006)

da fehlt schonmal ein select-tag


----------



## foobar (25. Jun 2006)

> also zunächst was meinst du damit :SQL in JSP einzubetten ist schlecht??


Wenn du schon JSP verwendest, dann pack kapsel deinen DB-Code z.b. durch DAOs und greif über Customtags darauf zu. Es gibt auch ganz nette vorefertigte CustomtagLibraries die dir z.b. For-Schleifen und sowas liefern mit denen du über Beans iterieren kannst. Guck dir z.b. mal Struts an, das macht viel mehr Sinn, als JSPs zu vergewaltigen.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
http://struts.apache.org/


----------



## spoona (25. Jun 2006)

jo, dachte aber dass das nicht so entscheidend ist. 
Habe es wie folgt geändert:


```
<select name="Wahl">
            <option>
            <%= while (rs.next()) { rs.getString(1) ; } %>
            </option>
            </select>
```

naja bekomme immer noch die Fehlermeldung:
C:\Dokumente und Einstellungen\krille.HOME\.netbeans\5.0\jakarta-tomcat-5.5.9_base\work\Catalina\localhost\WebApplication1\org\apache\jsp\Temp_005fDB_jsp.java:108: illegal start of expression
      out.print( while (rs.next()) {rs.getString(1);});
                 ^

An error occurred at line: 66 in the jsp file: /Temp_DB.jsp
Generated servlet error:
C:\Dokumente und Einstellungen\krille.HOME\.netbeans\5.0\jakarta-tomcat-5.5.9_base\work\Catalina\localhost\WebApplication1\org\apache\jsp\Temp_005fDB_jsp.java:108: ')' expected
      out.print( while (rs.next()) {rs.getString(1);});



übersehe ich irgendwo ein Semikolon oder eine Klammer??
Verdammt!!!
                                                      ^


----------



## foobar (25. Jun 2006)

> übersehe ich irgendwo ein Semikolon oder eine Klammer??


Jepp, du hast die runde Klammer der While-Schleife nicht geschlossen.


----------



## DP (26. Jun 2006)

an deiner stelle würde ich java erstmal bei seite legen und mir zuerst html aneignen. das was du da produziert ist schrott.


----------



## spoona (26. Jun 2006)

foobar hat gesagt.:
			
		

> Jepp, du hast die runde Klammer der While-Schleife nicht geschlossen.


Sorry, aber wo denn das? Ich kann es nicht sehen, ich bin blind




			
				DP hat gesagt.:
			
		

> an deiner stelle würde ich java erstmal bei seite legen und mir zuerst html aneignen. das was du da produziert ist schrott.


Also wenn man schon kritisiert, dann bitte richtig! Es sollte dann darauf hingewiesen werden, was deiner Meinung nach Schrott ist!. Ich habe gerade bewusst nicht auf die genaue Syntax geachtet, da es zunächst sekundär ist.
Es geht mir zunächst nur darum ein Dropdown Menu mit den Daten aus der Datenbank zu füllen.
Das ist das Hauptproblem! 

Sollte dir das besser gefallen:

```
<form action="">


<select size="1" name="Auswahl" width="250">
<option> <%= while (rs.next()) { rs.getString(1) ; } %></option>
</select></p>
</form>
```

Gruß Chris


----------



## AlArenal (26. Jun 2006)

spoona hat gesagt.:
			
		

> Ich habe gerade bewusst nicht auf die genaue Syntax geachtet, da es zunächst sekundär ist.
> Es geht mir zunächst nur darum ein Dropdown Menu mit den Daten aus der Datenbank zu füllen.
> Das ist das Hauptproblem!



Willlst du das Ding nun füllen, oder ist es sekundär? Wenn du es füllen willst, gehts so jedenfalls nicht, weil der produzierte HTML-Code nunmal falsch sein wird, unabhängig davon ob und wieviele Daten du ausgelesen bekommst. Nichts anderes wollte DP dir sagen.


----------



## spoona (26. Jun 2006)

AlArenal hat gesagt.:
			
		

> Willlst du das Ding nun füllen, oder ist es sekundär? Wenn du es füllen willst, gehts so jedenfalls nicht, weil der produzierte HTML-Code nunmal falsch sein wird, unabhängig davon ob und wieviele Daten du ausgelesen bekommst. Nichts anderes wollte DP dir sagen.


Das kann ja schön und gut sein, dass er mir das sagen wollte, aber dann soll er es auch richtig stellen.
Ich verstehe einfach nicht wie man sagen, das ist scheiße das ist Schrott und keine Stellung bezieht. Das hilft keinem weiter. 

Außerdem wenn ich die Option Tags mit manuellen Text fülle, erscheint es auch so auf der Webseite, wie ich es haben will. 
Also was soll nicht funktionieren?? Verstehe ich nicht? Anstatt Text soll jetzt nur noch ein Wert aus der Datenbank kommen. Also lieg das Problem nicht am HTML, oder wie?


----------



## foobar (26. Jun 2006)

```
<option> <%= while (rs.next()) { rs.getString(1) ; } %></option>
```
Guck dir mal diese Zeile genau an, dann wirst du sehen daß der Inhalt der ersten Option durch den Inhalt der ersten Spalte eines Resultsets ersetzt wird. Ist es das was du willst oder willst du nicht vielmehr alle Datensätze des Resultsets jeweils als Option formatieren?
Daher auch mein Rat, lern erstmal richtig Html/Xhtml CSS und JavaScript, dann hast du später weniger Probleme.


----------



## AlArenal (26. Jun 2006)

spoona hat gesagt.:
			
		

> Außerdem wenn ich die Option Tags mit manuellen Text fülle, erscheint es auch so auf der Webseite, wie ich es haben will



So, wie es in denem letzten Code steht, funzt es aber nur für eine einzige Option, da du die Option-Tags nicht für jede Ausgabe aus dem Result-Set setzt.

Aussehen sollte es so:

```
<select>
<option value ="volvo">Volvo</option>
<option value ="saab">Saab</option>
<option value ="opel" selected="selected">Opel</option>
<option value ="audi">Audi</option>
</select>
```

Bei dir sähe es so aus:

```
<select>
<option>Volvo</option>Saab Opel Audi</select>
```

..zumindest wenn ich das nach kurzer Nacht und den Handwerkern im Haus gerade richtig überblicke..


----------



## AlArenal (26. Jun 2006)

Genau genommen gibt das Ding glaub ich sogar gar nichts aus..

Ach herrje.. und jetzt auch noch ne Sommergrippe...


----------



## spoona (26. Jun 2006)

Ja genau da habt ihr beide recht. 
Aber das will ich ja sagen, dass ich zunächst einfach nur froh wäre, wenn diese dumme Datenbank mir endlich mal einen Wert zurück gibt. 
Es ist mir natürlich klar, dass ich mit dem bisherigen Quellcode nur einen Wert im Dropdown besitze.
Das ist aber zunächst völlig egal. Der Punkt ist ja, dass nur ein leeres ResultSet aus der DB kommt.
Ich kann auch eine Textfeld nehmen und versuchen es mit Inhalt zu füllen--> geht auch nicht.

Der folgende Code funktioniert nicht und ich weiß nicht warum?
Der Fehler muss am Gleich liegen, hinter dem Java Tag. Was ist daran falsch ? Ich finde auch den Klammerfehler nicht. 

```
<select name="Wahl"> 
            <option> 
            <%= while (rs.next()) { rs.getString(1) ; } %> 
            </option> 
            </select>
```

Dann mal gute Besserung


----------



## AlArenal (26. Jun 2006)

Ok, nachdem wir das geklärt haben, kommen wir mal zu des Pudels Kern. Ausgehend von deinem eingangs gepostetem SQL-Code, wird dein ResultSet nur eine Spalte haben. mit rs.getString(1) grteifst du aber auf die zweite zu - die es nicht gibt.

Bumm!

Weniger fehleranfällig, da übersichtlicher und variabler ist es auch, nicht über den Spaltenindex zuzugreifen, sondern über den Spaltennamen.


----------



## foobar (26. Jun 2006)

```
Ausgehend von deinem eingangs gepostetem SQL-Code, wird dein ResultSet nur eine Spalte haben. mit rs.getString(1) grteifst du aber auf die zweite zu - die es nicht gibt.
```
Nein, hier wird bei Eins angefangen zu zählen, das ist schon korrekt.



> etString
> 
> String getString(int columnIndex)
> throws SQLException
> ...


----------



## spoona (26. Jun 2006)

AlArenal hat gesagt.:
			
		

> Ok, nachdem wir das geklärt haben, kommen wir mal zu des Pudels Kern. Ausgehend von deinem eingangs gepostetem SQL-Code, wird dein ResultSet nur eine Spalte haben. mit rs.getString(1) grteifst du aber auf die zweite zu - die es nicht gibt.


Auf die Zweite? Kann gerade nicht folgen sorry, der Index beginnt doch bei Eins oder nicht.
Ok dann werde ich lieber über den Spaltennamen arbeiten ,das ist auch schöner.
Kann leider gerade nichts ausprobieren, werde erst heute abend dazu kommen.
Dann werde ich mich aber bestimmt wieder melden.

Vielen Dank aber erstmal


----------



## foobar (26. Jun 2006)

@spoona Kannst du denn von einem Konsoleprogramm aus auf die DB zugreifen? Hast du keine IDE mit Syntaxhighlighting für JSP, die dich bei der Fehlersuche unterstützt?
Guck dir mal Eclipse + Lomboz-Plugin oder Eclipse + MyEclipse-Plugin.


----------



## AlArenal (26. Jun 2006)

@foobar:

Dann habe ich nichts gesagt und behaupte das Gegenteil 
JDBC ist schon ne Weile her bei mir und ich muss schiffen wie blöde und die scheiß Handwerker werden nicht fertig


----------



## foobar (26. Jun 2006)

> und ich muss schiffen wie blöde und die scheiß Handwerker werden nicht fertig


Danke für diese wertvolle Information, da bekomme ich doch gleich Appetit auf mein Frühstück ;-)


----------



## spoona (26. Jun 2006)

@foobar Also ich verwende gerade Netbeans zur Entwicklung. Muss ich mal schauen, wie das mit Syntaxhighlighting für JSP aussieht. Du meinst also ob ich überhaupt ein Ergebnis aus der Datenbank bekomme, wenn ich ein Select Statement über einen z.B. SQL Manager abschicke? 
Ja da bekomme ich ein Ergebnis zurück.


----------



## Murray (26. Jun 2006)

Bin zwar nicht gerade ein JSP-Experte, aber ist es nicht so, dass das hier gewählte Konstrukt der JSP-Expression

```
<%= ... %>
```
überhaupt nicht leisten kann, was hier gebraucht wird? Bei so einer Expression wird doch zunächst der gesamte Ausdruck evaluiert und das Ergebnis dann in den HTML-Code eingebettet. Und was ist denn der Return-Wert einer While-Schleife?

Vermutlich braucht man hier eher ein JSP-Scriptlet:

```
<%
  while (rs.next()) {
%>
    <option> <%= rs.getString(1)  %></option>
<%
  }
%>
```


----------



## spoona (26. Jun 2006)

Jo das könnte gut aussehen.
Das kann der Fehler sein. 
Werde es heute abend gleich mal ausprobieren.

Danke


----------



## AlArenal (26. Jun 2006)

Ist JSP in der Praxis wirklich so hässlich? Buhhh....


----------



## foobar (26. Jun 2006)

> Ist JSP in der Praxis wirklich so hässlich? Buhhh....


Nein, Jsp muß nicht so aussehen. Man kann damit auch sauber arbeiten z.b. durch entsprechende Frameworks oder eigene Taglibs.


----------



## Guest (26. Jun 2006)

Hallo, es hat endich funktioniert.

Ich habe jetzt ein Dropdown-Menu mit 3 Werten aus der Datenbank

der folgende code hat zum gewünschten Ergebnis geführt:

```
...
            <% while (rs.next()){%>
            <option>
            <%= rs.getString("1")%>
            </option>
            <%}%>
```

Vielen Dank für Eure Hilfe
Gruß Spoona


----------



## spoona (26. Jun 2006)

Mist habe vergessen mich anzumelden.
Sorry


----------

