Java - Consulta a BD Access

 
Vista:
sin imagen de perfil

Consulta a BD Access

Publicado por Lazaro (6 intervenciones) el 20/04/2016 13:32:26
Buenos dias, me encuentro desarrollando un pequeñisimo programita que hace una consulta a una BD de Microsoft Access (que en realidad es usada por otro sistema).
El problema es que pareciera como que mi consulta devolviera "null", y además en consola me describe un error de otra tabla (no a la que estoy consultando), además la consulta es muuuuuuuuy sencilla.

Esta es la clase Conexión:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.sql.Connection;
import java.sql.DriverManager;
 
public class Conexion {
 
    private Connection con;
 
    public boolean conectar()
    {
        try
        {
            // CONEXION
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
            con = DriverManager.getConnection("jdbc:ucanaccess://C:/Program Files/ZKTime5.0/miBase.mdb");
            return true;
        }
        catch (Exception ex)
        {
            System.out.println("Error en la conexión a la base de datos: "+ex.getMessage());
            ex.printStackTrace();
            return false;
        }
    }
}

Y esta seria la consulta que realizo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class DatosReloj {
 
	public ArrayList<Reloj> getRelojes()
	{
		ArrayList<Reloj> relojes = new ArrayList<Reloj>();
		String consulta = "SELECT Machines.MachineAlias, Machines.MachineNumber FROM Machines;";
		Connection conn = null;
		Conexion con = new Conexion();
		con.conectar();
 
		try
		{
			PreparedStatement st = conn.prepareStatement( consulta );
			ResultSet rs = st.executeQuery();
			int i=0;
			while(rs.next())
			{
				Reloj reloj = new Reloj();
				reloj.setNombre(rs.getString("MachineAlias"));
				reloj.setNumero(rs.getString("MachineNumber"));
				relojes.add(reloj);
				i++;
			}
		}
		catch(Exception ex)
		{
			System.out.println(ex.getMessage());
		}
		return(relojes);
	}
}

Y mientras corro el programa, a la hora de ejecutarse la consulta en la consola me informa lo siguiente:

WARNING:Detected Not Null constraint breach, table DEPARTMENTS, record Row[52:8][{DEPTID=9,DEPTNAME=Norte,SUPDEPTID=1,InheritParentSch=1,InheritDeptSch=1,InheritDeptSchClass=1,AutoSchPlan=1,InLate=1,OutEarly=1,InheritDeptRule=1,MinAutoSchInterval=24,RegisterOT=1,DefaultSchId=1,ATT=1,Holiday=1,OverTime=1}]: making the table DEPARTMENTS readonly
WARNING:Default values should start and end with a double quote, the single quote is considered as part of the default value 'I' (column CHECKTYPE,table CHECKINOUT)."
It may result in a data truncation error at runtime, because the column maxsize is 1.
null
null
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Consulta a BD Access

Publicado por Maverick (109 intervenciones) el 20/04/2016 21:55:00
Estimado Lazaro,

Sobre el tema sugiero que revises primero tu clase Reloj probablemente es una clase tipo entidad @Entity que esta haciendo referencia a la tabla DEPARTMENTS de tu modelo de datos, revisa ello en primer lugar.

Sobre el tema de tu cadena SQL:

SELECT Machines.MachineAlias, Machines.MachineNumber FROM Machines

Sugiero que debes poner un alias a tu tabla o en todo caso haz referencia solo al nombre del campo sin anteponer el nombre de la tabla:

a) SELECT m.MachineAlias, m.MachineNumber FROM Machines m

O

b) SELECT MachineAlias, MachineNumber FROM Machines

Espero haberte apoyado, cualquier consulta puedes escribir a: [email protected]

Saludos

Maverick
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Lazaro (6 intervenciones) el 22/04/2016 01:32:46
Maverick, muchas gracias por el aporte.

Realicé las pruebas que me comentaste sobre la consulta.

En cuanto a la clase reloj, no se a que te referis con que es de tipo Entity y que hace referencia a la tabla Departments.

Aquí adjunto la declaracion de la clase:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package entidades;
 
public class Reloj {
 
	private String ip;
	private String numero;
	private String nombre;
	private String descripcion;
 
	public String getIp() {
		return ip;
	}
 
	public void setIp(String ip) {
		this.ip = ip;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getDescripcion() {
		return descripcion;
	}
 
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
 
	public String getNumero() {
		return numero;
	}
 
	public void setNumero(String numero) {
		this.numero = numero;
	}
}

Muchas gracias, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Roberto (5 intervenciones) el 25/04/2016 14:23:24
Debes fijarte que el objeto conn siempre va a ser nulo, porque tu en la clase Conexion no estás devolviendo la conexión, la estás seteando en un objeto Connection interno de esa clase. Entonces, o bien devuelves la conexión, o haces un método getter en la clase Conexion, para recuperar la conexión:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class DatosReloj {
 
	public ArrayList<Reloj> getRelojes()
	{
		ArrayList<Reloj> relojes = new ArrayList<Reloj>();
		String consulta = "SELECT Machines.MachineAlias, Machines.MachineNumber FROM Machines;";
		Connection conn = null;
		Conexion con = new Conexion();
		con.conectar();
 
		try
		{
			PreparedStatement st = con.getConexion().prepareStatement( consulta );
			ResultSet rs = st.executeQuery();
			int i=0;
			while(rs.next())
			{
				Reloj reloj = new Reloj();
				reloj.setNombre(rs.getString("MachineAlias"));
				reloj.setNumero(rs.getString("MachineNumber"));
				relojes.add(reloj);
				i++;
			}
		}
		catch(Exception ex)
		{
			System.out.println(ex.getMessage());
		}
		return(relojes);
	}
}

Espero haberte ayudado.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Lazaro (6 intervenciones) el 25/04/2016 16:39:41
Buenos días Roberto:
Muchas gracias por tu comentario. Disculpa mi ignorancia, pero no entiendo la línea de codigo que agregaste:

1
PreparedStatement st = con.getConexion().prepareStatement( consulta );

Porque la variable con es de tipo Conexion, que es una clase creada por mi que es donde realizo la conexión y el metodo prepareStatement() pertenece a la clase Connection (definida en el import de sql).

Muchas gracias!! Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Roberto (5 intervenciones) el 26/04/2016 13:16:51
En tu clase conexión, debes implementar un método getConexion(), que devuelva el objeto Connection. Porque tu lo que estás haciendo ahora es:

1
2
3
Connection conn = null;
Conexion con = new Conexion();
con.conectar();

y luego en el try:

1
PreparedStatement st = conn.prepareStatement( consulta );

Pero realmente así como lo tienes, el objeto conn siempre va a ser nulo. Espero haberme explicado bien.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Lazaro (6 intervenciones) el 26/04/2016 14:27:02
Ahora sí Roberto! Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta a BD Access

Publicado por Lazaro (6 intervenciones) el 27/04/2016 16:01:42
Aclaro por si alguien tiene un problema similar.
El error lo solucioné agregando como sitio de confianza la carpeta donde estaba ubicada la BD desde Microsoft Access.
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar