# 2 Anfängerfragen zu Queries



## megachucky (9. Sep 2006)

Hallo.

Hab noch folgende zwei Fragen:



1. Beim Zugriff auf ResultSet "user_rs1" in der if-Schleife kommt die Meldung:

Error while executing the query java.sql.SQLException: Operation not allowed after ResultSet closed

Wenn ich die if Schleife vor password_rs2 mache, kommt diese Exception nicht. Wieso? Wird die erste rs automatisch geschlossen / gelöscht, wenn eine zweie gemacht wird?




2. Die folgende if Schleife wird nicht ausgeführt, obwohl die Bedingung doch eigentlich passen müsste. Beim test vorher wird ja auch "Kai" auf der Konsole ausgegeben ?!? "logged in" wird aber nicht ausgegeben ?!?


```
// test ob gefunden
			System.out.println( rs1_user.getString(1) );
			
			
		
			if (rs1_user.getString(1) == "Kai" )
			{
				isLoggedIn = true;
				System.out.println("Logged in.");
			}
```



Hier die ganze Klasse:


```
package server;

import java.sql.*;

public class Server implements LoginInterface
{
	private Connection connection;
	
	private String user;
	private String password;
	private Statement stmt1, stmt2;
	private ResultSet rs1_user, rs2_password;
	
	private boolean isLoggedIn = false;
	
	public void login(String user, String password)
	{
		connection = new DatabaseConnection().connectToDatabase();
		this.user = user;
		this.password = password;
		
		try
		{
			stmt1 = connection.createStatement();
			String userQuery = "SELECT username FROM user WHERE username = 'Kai'";
			rs1_user = stmt1.executeQuery(userQuery);
			rs1_user.next();
			
			// test ob gefunden
			System.out.println( rs1_user.getString(1) );
			
			
		
			if (rs1_user.getString(1) == "Kai" )
			{
				isLoggedIn = true;
				System.out.println("Logged in.");
			}
			
			
			stmt2 = connection.createStatement();
			String passwordQuery = "SELECT password FROM user WHERE password = '1111'";
			rs2_password = stmt1.executeQuery(passwordQuery);
			rs2_password.next();
			
			
			System.out.println( rs2_password.getString(1) );
		
		
			
			
		}
			
		catch (SQLException e)
		{
			System.err.println("Error while executing the query " + e);
		}
		catch (Exception e)
		{
			System.err.println("Username and / or password wrong");
		}
		
		
		
	}
	
	public void logout()
	{
		isLoggedIn = false;
		System.out.println("Logged out.");
	}
	
	public boolean isLoggedIn()
	{
		return isLoggedIn;
	}
	
	public void setLoggedIn(boolean loggedIn)
	{
		this.isLoggedIn = loggedIn;
	}
	
	
	
	
	
	
	
}
```


----------



## bronks (9. Sep 2006)

```
if (rs1_user.getString(1) == "Kai" )
```
Strings vergleicht man mit "equals"

In Deinem Programm können viel mehr Exceptions geschmissen werden, als sich Deine Fehlerbehandlung vorstellen kann. Lass Dir mit "e.printStackTrace()" den Trace ausgeben. In diesem steht der Fehler vollständig und verständlich incl. Position drin.


----------



## megachucky (9. Sep 2006)

Ok, mit equals geht es. Das benutzt man immer, wenn man Objekte vergleichen will, richtig?

Das zweite Problem bleibt aber noch, der Stacktrace sagt mir auch nicht mehr (zumindest kann ich nicht mehr rauslesen):

Error while executing the query 
java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
	at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:644)
	at com.mysql.jdbc.ResultSet.checkRowPos(ResultSet.java:682)
	at com.mysql.jdbc.ResultSet.getStringInternal(ResultSet.java:5487)
	at com.mysql.jdbc.ResultSet.getString(ResultSet.java:5431)
	at server.Server.login(Server.java:45)
	at testCode.TestServer.main(TestServer.java:10)


----------



## bronks (9. Sep 2006)

megachucky hat gesagt.:
			
		

> ...	at server.Server.login(Server.java:45 ...


Das wird m.E. daran liegen, weil in Zeile 44 vom Execute kein Ergebniss zurückgegeben wird.


----------

