Null als return obwohl datensatz existiert

Icke

Mitglied
Guten Tag.
Ich schreibe gerade eine Applikation fürs Handy mit einer SQL Datenbank. Ich habe einen Datensatz in die Datenbank geschrieben und wollte nun den Login gestalten. Dazu wollte ich den Datensatz mit Testdaten erstmal vergleichen. Hier ist mein Code:

Login überprüfen:
Java:
//Logindaten prüfen hinzufügen
		@WebMethod(operationName ="benutzerlogin_pruefen")
		/**
		 * @param bnummer Benutzername
		 * @param pw Passwort
		 **/
		public boolean benutzerlogin_pruefen(
				@WebParam(name ="benutzername") String bname,
				@WebParam(name ="passwort") String pw)
		
		{		
		// Testen der Datenbankanbindung
		DatabaseConnection.connectdb();
		
			// Benutzername in der Datenbank suchen
		
		    String bname1 = "SELECT BENUTZERNAME"
				+"FROM BENUTZER"
				+"WHERE BENUTZERNAME='"+bname+"'";
		   
		    ResultSet bname2 = DatabaseConnection.selectdb(bname1);
		    System.out.print(""+bname2+"");
		    //Passwort und Benutzerdaten vergleichen
		    
			  String pwtrue = "SELECT passwort"
				  			+"FROM passwort"
				  			+"WHERE benutzername='"+bname+"'";
			  
			  ResultSet pwdb = DatabaseConnection.selectdb(pwtrue);
			  
			// Schauen ob Benutzer existiert  
		    if (bname2==null){   	
		   System.out.println("Benutzername existiert nicht!"); 	
			 return false; }
		    // Schauen ob Passwort übereinstimmt
		    else if (pwtrue!=pw){
			System.out.println("Passwort ist falsch!");
		return false;
		
		 // Falls Benutzer und Passwort existrieren und übereinstimmen
		}else{ 
			return true;
			
		
		    }
		}


Datenbankverbindung ( select befehl )
Java:
    // Datensätze aus der Datenbank holen
    public static ResultSet selectdb(String str) {
        try {
            stmt.execute(str);
            return stmt.getResultSet();
        } catch (SQLException e2) {
            System.out.print("Fehler!");
            return null;
        }
    }

Testdaten:
Java:
public class test {
	
	public static void main(String[] args) { 
		
		String bname="Dennis";
		String pw="MCIMMA";
		boolean status;
		scws Dennis = new scws();
		status = Dennis.benutzerlogin_pruefen(bname, pw);
		if (status)
			System.out.print("Sind gleich");
		else
			System.out.print("sind nicht gleich");
		
}
}


Fehlerausgabe:
Fehler!nullFehler!Benutzername existiert nicht!
sind nicht gleich

Also der Datensatz mit Dennis und dem passwort ist 100% in der datenbank und eine verbindung zur datenbank besteht auch. Jedoch was mache ich falsch, dass ein null zurück kommt, obwohl ja Dennis ( bname ) drin steht?!? Wäre für jede Hilfe dankbar.

Frohe Pfingstage
 
Änder doch einfach mal den DatenbankAnfrageteil wie folgt:

Java:
 public static ResultSet selectdb(String str) {
        try {
            stmt.execute(str);
            return stmt.getResultSet();
        } catch (SQLException e2) {
            System.out.print("Fehler! " + e2.getMessage());
            return null;
        }
    }

Das könnte dir weiter helfen 😉

Des weiteren fehlen dir ein paar Lehrzeichen in deinen Sql-Statements.
Vileicht ist das schon das Problem ?
 
Java:
    // Datensätze aus der Datenbank holen
    public static ResultSet selectdb(String str) {
        try {
            stmt.execute(str);
            return stmt.getResultSet();
        } catch (SQLException e2) {
            System.out.print("Fehler!");
            return null;
        }
    }
Wo wird bei Dir stmt initialisiert?

VG und ein schöne WE,
ROlf
 
Das stmt initialisiere ich in der databseconnection
Java:
public class DatabaseConnection {

    public static Statement stmt = null;
    public static ResultSet rs = null;

    // Verbindung zur Datenbank wird aufgebaut
    public static void connectdb() {

Ich habe den Quellcode nochmals umgeschrieben für Benutzer_login und erhalte jetzt immer ein "sind gleich" .. ich suche jetzt nur noch datensätze wo benutzer und das passwort drinne stehen. jedoch, wie gesagt, kommt immer "true" raus :/

Java:
		//Logindaten prüfen hinzufügen
		@WebMethod(operationName ="benutzerlogin_pruefen")
		/**
		 * @param bnummer Benutzername
		 * @param pw Passwort
		 **/
		public boolean benutzerlogin_pruefen(
				@WebParam(name ="benutzername") String bname,
				@WebParam(name ="passwort") String pw)
		
		{		
		// Testen der Datenbankanbindung
		DatabaseConnection.connectdb();
		    
			  String pwtrue = "SELECT BENUTZERNAME FROM BENUTZER WHERE BENUTZERNAME='"+bname+"'AND PASSWORT='"+pw+"'";
			  
			  ResultSet pwdb = DatabaseConnection.selectdb(pwtrue);
			  
			// Benutzer oder Passwort existieren nicht ( Kein Datensatz wird zurückgegeben )
		    if (pwdb==null){
			System.out.println("Falsche Eingabe");
		return false;
		
		 // Falls Benutzer und Passwort existrieren und übereinstimmen
		}else{ 
			return true;
			
		
		    }
		}
 
Wenn pwdb nicht null ist, heißt das nicht, dass Benutzer und Passwort übereinstimmen,
sondern nur, dass ein gültiger ResultSet zurückgeliefert wurde. Dieser kann aber dennoch
leer sein. Du musst in also auch noch prüfen ob ein gültiger Datensatz im ResultSet enthalten ist.

VG ROlf
 
poste den stacktrace (e.printStackTrace), ist garantiert ne NPE

Java:
    public static ResultSet selectdb(String str) {
        try {
            stm = connection.createStatement();
            stmt.execute(str);
            return stmt.getResultSet();
        } catch (SQLException e2) {
            e.printStackTrace();
            return null;
        }
    }

Statement und ResultSet close nicht vergessen (wenn du mit dem verarbeiten fertig bist)
 
Zuletzt bearbeitet von einem Moderator:
Wie prüfe ich denn, ob ein gültiger Resultset zurückgegeben wird? Sry stehe gerade aufn Schlauch 🙁
 
Zuletzt bearbeitet:
Also ich bekomme wenn ich richtige daten angebe, diese auch zurück und es ist true. wenn ich falsche daten angebe , bekomme ich bei der ausgabe keine daten ( so wie es richtig ist ) jedoch bekomme ich auch ein true zurück, wobei es ja false sein müsste... :/
 
Vlt. funktioniert "isBeforeFirst()" ?

true if the cursor is before the first row; false if the cursor is at any other position or the result set contains no rows

Ich verstehe allerdings nicht ganz warum das mit next nicht funktioniert:
next return
true if the new current row is valid; false if there are no more rows



Ist leider schon ein wenig her das ich mit Java im DB Umfeld tätig war.
 
Wenn ich das mit next mache, dann meckert er bei den Klammern
Java:
		{		
		// Testen der Datenbankanbindung
		DatabaseConnection.connectdb();
			 String Gefunden = "SELECT BENUTZERNAME,PASSWORT FROM BENUTZER WHERE BENUTZERNAME='"+bname+"'AND PASSWORT='"+pw+"'";
		
			  ResultSet did = DatabaseConnection.selectdb(Gefunden);
			// Benutzer oder Passwort existieren nicht ( Kein Datensatz wird zurückgegeben )
			  try {
			  if (did.next()) {
			
		return false;
		 // Falls Benutzer und Passwort existieren und übereinstimmen
		}else{ 
			return true;
		 }catch (SQLException e) {
			    // TODO Auto-generated catch block
			    e.printStackTrace();
			   }
			  }
		}
 
Wenn ich das mit next mache, dann meckert er bei den Klammern
Weil die nicht stimmt. try und catch sind an völlig falscher Stelle.
Ausserdem soll ja nur zurückgegeben werden ob User und Passwort Kombination vorhanden sind.
Da würde folgendes reichen. (ResultSet#next() liefert ja bereits ein boolean)
Java:
return resultSet.next();
 

Zurück
Oben