Fallo Java conexion BD

Lolerpopler

Edit: Solucionado

Bueno pues estaba programando un login en java y me he quedado atascado en un paso.
Tengo método que se encarga de conectarse a la BD y devolver true o false si ha encontrado al usuario en la base de datos y su contraseña coincide con la que ha introducido.
Mi problema está en que al ejecutar la sentencia me sale directamente y pasa al siguiente paso, en este caso el mensaje de error. El error estaría en esta línea:

ResultSet rs = sentencia.executeQuery("Select contra from admin where usuario='"+nombre+"'");

Pero no logró ver el que.
Decir que he comprobado que las variables nombre y contraseña las recoge de la interfaz bien y que la conexión a la base de datos funciona.

Aquí os dejo el método

spoiler
willy_chaos

El e.printStackTrace() que te dice?

Cuando yo tuve que hacer consultas desde java a la base de datos, recuerdo que habia 2 instrucciones.

1 - Para las query
2 - Para los insert, update, delete

Revisa que estes usando la correcta para cada caso.

1 respuesta
Lolerpopler

#2 justo ahi nada por que falta que se muestre el mensaje, pero aqui que lo tengo puesto me manda una excepcion: java.sqlException: Before start of result set

En teoría la instrucción debería estar bien. es una select para que me coja de la tabla admin el campo "contra" de la fila que tiene un usuario que coincida con el que han introducido. Y teniendo la contraseña de la bd y la que ha introducido pro teclado las comparo

NoRelaX

¿No deberías meter el ResultSet y la comprobación dentro de un bucle while(rs.next())?

2 respuestas
willy_chaos

Cierto, recuerdo que el resultset se iniciaba a 0, y el primer resultado, tenias que hacer el .next() para poder verlo.

Con lo cual, antes de comparar tienes que hacer el .next() porque si no creo que estas comparando con el puntero de inicio del "array".

1 1 respuesta
Lolerpopler

#4 Lo probe antes y me pasaba lo mismo.
Voy a volver a a mirar, no vaya a ser que la liase en algo antes

willy_chaos

No hace falta que sea un bucle, con que hagas un .next sabiendo que solo te ha devuelto 1 resultado (si es valido...) ya esta.

1 respuesta
Lolerpopler

#7 din din din

Vale he vuelto a probar en un while y me daba error.

He puesto el rs.next() sin bucle just antes de la condicion y me ha entrado en la siguiente pantalla.

Gracias a todos #4 #5

1
willy_chaos

Te iba a poner justo el codigo que use yo (aunque en mi caso tenia una clase hecha por mi para la bd)

Lo dejo aqui igualmente por si le sirviera a alguien

				String query = "SELECT userid FROM "+Database.dbt_players+" WHERE "+Database.dbt_players_fieldLogin+"='"+this.name+"'";
				java.sql.ResultSet result = Database.execSQL(query);
				
			
			if ( result.next() ) {
				int id = result.getInt(1);
				query = "INSERT INTO "+Database.dbt_scores+" (`userid`,`score`,`date`) VALUES ( '"+id+"', '"+puntuacion+"', CURRENT_TIMESTAMP)";
				Database.execUpdateSQL(query);
				aux = true;
			}
Soltrac

Aunque sean aplicaciones de escritorio, parametrizad coño, q cualquiera hace un SQL Injection y entra en la aplicación y los máximos responsables sois vosotros.

1 1 respuesta
MTX_Anubis

#10 +1

Debería ser así:

PreparedStatement stm = conexion.prepareStatement("Select contra from admin where usuario = ?");
stm.setString(1,nombre); //también vale con setObject pero creo que es dependiente del driver, con el de postgresql hace comprobaciones de todos los tipos y usa su metodo correspondiente por ejemplo
ResultSet rs = stm.executeQuery();

Usuarios habituales

  • MTX_Anubis
  • Soltrac
  • willy_chaos
  • Lolerpopler
  • NoRelaX