Estou fazendo uma consulta a um banco de dados PostGre, em uma tabela que eu sei que (por enquanto) está com 16 dados. O problema é que meu ResultSet está voltando vazio… Tentei dar uma olhada nas outras postagens aqui no fórum e na internet, mas não consegui encontrar nada que resolvesse.
O acesso ao banco de dados é feito da seguinte maneira:
public static Connection getConnection() {
Connection connection = null; //atributo do tipo Connection
try {
// Carregando o JDBC Driver padrão
String driverName = "org.postgresql.Driver";
Class.forName(driverName);
//Concatena a string de conexão em uma url
String url = "jdbc:postgresql://"+sServer+":"+sPort+"/"+sDatabase;
//Solicita conexão com o banco de dados
connection = DriverManager.getConnection(url, sUser, sPassword);
//Testa sua conexão//
if (connection != null) {
status = ("Connected");
} else {
status = ("Disconnected");
}
return connection;
} catch ( ClassNotFoundException | SQLException e) {
status = (e.getMessage());
return null;
}
}
e a query de consulta ao banco de dados pode ser vista abaixo:
public static String[][] listRawStudent()
{
//Gera array de retorno
String[][] returnArray;
try
{
//Conecta com o banco de dados
Connection conn;
conn = clDataBase.getConnection();
//Cria statement e a string de conexão
Statement stmt = conn.createStatement();
//Inicia ResultSet
ResultSet rs;
rs = stmt.executeQuery("select guest_id, guest_name from guest");
//Para poder iniciar o array de retorno, move o ponteiro do
//ResultSet para o final
rs.last();
//Pega o valor da última linha
int linhas = rs.getRow();
//Inicializa a variável de retorno
returnArray = new String[16][2];
//Retorna o ponteiro para o início
rs.first();
//Inicializa um contador
int contador = 0;
while(rs.next()) //enquanto existe uma proxima linha
{
//Adiciona dados para o array
returnArray[contador][0] = rs.getString("id");
returnArray[contador][1] = rs.getString("name");
contador ++;
}
}
catch(SQLException e)
{
status = (e.getMessage());
returnArray = new String[0][0];
}
//Fecha a conexão
closeConexao();
return returnArray;
}
O array de retorno volta null em todas as consultas… Por sua vez, o erro retornado pelo Java é o seguinte:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at testcampus.TestCampus.main(TestCampus.java:21)
C:\Users\tiago\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 2 segundos)
Alguma ideia ou sugestão sobre o que está ocorrendo?
Bom pela stack de erro, a matriz de 16x2 não está comportando os dados da consulta, quantos registros em média existem na tabela?
Você pode tornar o tamanho das linhas da matriz dinâmico assim:
...
returnArray = new String[linhas][2];
...
Veja se o erro persiste?
Outra dica: evite usar Statement, pesquise sobre PreparedStatement…
Obs: cuidado com isso
rs.getString("id")
Pode ocasionar outros erros, já que na consulta o nome é guest_id, guest_name, etc… procurre deixar da mesma forma no getString…
Então, eu estava usando o parâmetro linhas para dar o tamanho da Array (até por isso eu calculava o tamanho do retorno).
Mesmo fazendo as alterações sugeridas, continuo com retorno de uma matriz [0][0]…
Fiz as alterações que me você me sugeriu:
//Método pra listar os dados brutos dos estudantes
public static String[][] listRawStudent()
{
//Gera array de retorno
String[][] returnArray;
try
{
//Conecta com o banco de dados
Connection conn = clDataBase.getConnection();
//Cria string de pesquisa
String tsql = "select guest_id, guest_name from guest";
//Cria statement e a string de conexão
PreparedStatement stmt = conn.prepareStatement(tsql);
//Inicia ResultSet
ResultSet rs = stmt.executeQuery();
//Para poder iniciar o array de retorno, move o ponteiro do
//ResultSet para o final
rs.last();
//Pega o valor da última linha
int linhas = rs.getRow();
//Inicializa a variável de retorno
returnArray = new String[linhas][2];
//Retorna o ponteiro para o início
rs.first();
//Inicializa um contador
int contador = 0;
while(rs.next()) //enquanto existe uma proxima linha
{
//Adiciona dados para o array
returnArray[contador][0] = rs.getString("guest_id");
returnArray[contador][1] = rs.getString("guest_name");
contador ++;
}
}
catch(SQLException e)
{
status = (e.getMessage());
returnArray = new String[0][0];
}
//Fecha a conexão
closeConexao();
return returnArray;
}
Rodando a mesma query dentro do PostGre, tenho um retorno normal e com todos os registros.
Quando da alguma exceção, vc retorna uma matriz “vazia”. Ou vc trata este retorno lá onde vc chamou o método, ou usa melhor o tratamento de exceção, retornando uma exceção pra cima com throw.
E adiciona um e.printStackTrace() no seu catch para ver oque está acontecendo.
Você tinha toda razão, Rodrigo.
De fato, o problema é que o ResultSet não era rolável. Esse erro estava indo para o status e eu não estava tratando.
Erro encontrado e corrigido (transformei o resultset em rolável).
Por fim, ficou da seguinte maneira
//Método pra listar os dados brutos dos estudantes
public static String[][] listRawStudent()
{
//Gera array de retorno
String[][] returnArray;
try
{
//Conecta com o banco de dados
Connection conn = clDataBase.getConnection();
//Cria string de pesquisa
String tsql = "select guest_id, guest_name from guest "
+ "order by guest_id asc";
//Cria statement e a string de conexão
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//Inicia ResultSet
ResultSet rs = stmt.executeQuery(tsql);
//Para poder iniciar o array de retorno, move o ponteiro do
//ResultSet para o final
rs.last();
//Pega o valor da última linha
int linhas = rs.getRow();
//Inicializa a variável de retorno
returnArray = new String[linhas][2];
//Retorna o ponteiro para o início
rs.first();
//Inicializa um contador
int contador = 0;
while(rs.next()) //enquanto existe uma proxima linha
{
//Adiciona dados para o array
returnArray[contador][0] = rs.getString("guest_id");
returnArray[contador][1] = rs.getString("guest_name");
contador ++;
}
}
catch(SQLException e)
{
status = (e.getMessage());
returnArray = new String[0][0];
}
//Fecha a conexão
closeConexao();
return returnArray;
}