Java + access - Estado de cursor inválido

9 respostas
GraveDigger

E ae galera, blz?

Estou tendo problemas com o access, tento acessar a tabela names com o seguinte código:

try { 
			Class.forName ( "sun.jdbc.odbc.JdbcOdbcDriver" );
			
			Connection con = 
				DriverManager.getConnection ( "jdbc:odbc:Data", "", "" );
			
			Statement stt = con.createStatement();
			
			System.err.println ( "statement criado com sucesso" );
			
			String consulta = "SELECT * FROM names";
			
			ResultSet result = stt.executeQuery( consulta ); 
			
			ResultSetMetaData data = result.getMetaData();
			
			StringBuffer output = new StringBuffer();
			
			int column = data.getColumnCount();
			
			for ( int i = 1; i <= column; i++ )
				output.append ( result.getObject ( i ) );
							
			System.err.println ( output.toString() );
						
			stt.close();
			con.close();	
		}
		
		catch ( SQLException sqlex ) {
			System.err.println ( sqlex.getMessage() );
		}
		
		catch ( ClassNotFoundException cnfex ) {
			System.err.println ( "Class not found" );
		}
		
	}

Edit: Esqueci de dizer o problema :oops:

Ao tentar acessar a tabela, o prog me retorna o seguinte erro:

Estado de cursor inválido.

Gostaria de saber o q causa esse problema.

[]'s

9 Respostas

pauloperes

Tudo bem, mas qual o problema, o que está dando de erro?

Atenciosamente,

Paulo

G

Cara, pelo o que eu vi no seu código, daria para fazer assim:

String driver="seu driver";
	String url="sua url";
	String username="username";
	String senha="password";
	
	
	Class.forName(driver);
	
	String sql="select * from names";
	Connection con=DriverManager.getConnection(url,username,senha);
	Statement st=con.createStatement();
	
	ResultSet rs=st.executeQuery(sql);
	
	//Pega a quantidade de colunas
		int colunas=rs.getMetaData().getColumnCount();
	
	StringBuffer output=new StringBuffer();
		
	while(rs.next()){
		for(int i=1;i<=colunas;i++){
			output.append(rs.getObject(i));
			
		}
	}
	st.close();
	rs.close();
	con.close();
	
	
}
GraveDigger

Q estranho…

Meu ResultSet parece q naum tem valor…

Mesmo eu tendo adicionado alguns itens a minha tabela, ao passar pelo :

while ( rs.next() )

o programa pula essa parte como se o resultado fosse false, mas a tabela contém valores!!!

Alguém tem mais alguma idéia?

_fs

Tenta fazer um rs.beforeFirst() ou rs.first()

ps: Quando vc for postar codigo, coloque-o entre as tags [ code] e [ /code], assim ele ficará endentado.

GraveDigger

LIPE:
Tenta fazer um rs.beforeFirst() ou rs.first()

ps: Quando vc for postar codigo, coloque-o entre as tags [ code] e [ /code], assim ele ficará endentado.

Usar essese métodos como?

L

Experimente este exemplo:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.ResultSet;
public class Exemplo012

{

public static void main(String args[])

{ try

{ Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);

}

catch(ClassNotFoundException ce)

{ System.out.println(Erro (Conexao1):+ce.getMessage());

}

try

{ String caminho=c:/arq.mdb;

String url=jdbc:odbc:DBQ=+caminho+";Driver={Microsoft Access Driver (*.mdb)}";

String username="";

String senha="";
String sql="select * from names"; 
Connection con=DriverManager.getConnection(url,username,senha); 
Statement st=con.createStatement(); 

ResultSet rs=st.executeQuery(sql);

// Pega a quantidade de colunas
int colunas=rs.getMetaData().getColumnCount();

StringBuffer output=new StringBuffer(); 

while(rs.next())
{ for(int i=1;i<colunas;i=i+4)
  { System.out.println(output.append(rs.getObject(i)+" "+rs.getObject(i+1)+" "+rs.getObject(i+2)+" "+rs.getObject(i+3)+" "+rs.getObject(i+4)));
  } 
}
rs.close();st.close();con.close();

}

catch(SQLException se)

{ System.out.println(Erro (Conexao2):+se.getMessage());

}

}

}

<img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=9" title=":slight_smile:" class="emoji" alt=":slight_smile:"> falow
L

Experimente este exemplo:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.ResultSet;
public class Exemplo012

{

public static void main(String args[])

{ try

{ Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);

}

catch(ClassNotFoundException ce)

{ System.out.println(Erro (Conexao1):+ce.getMessage());

}

try

{ String caminho=c:/arq.mdb;

String url=jdbc:odbc:DBQ=+caminho+";Driver={Microsoft Access Driver (*.mdb)}";

String username="";

String senha="";
String sql="select * from names"; 
Connection con=DriverManager.getConnection(url,username,senha); 
Statement st=con.createStatement(); 

ResultSet rs=st.executeQuery(sql);

// Pega a quantidade de colunas
int colunas=rs.getMetaData().getColumnCount();

StringBuffer output=new StringBuffer(); 

while(rs.next())
{ for(int i=1;i<colunas;i=i+4)
  { System.out.println(output.append(rs.getObject(i)+" "+rs.getObject(i+1)+" "+rs.getObject(i+2)+" "+rs.getObject(i+3)+" "+rs.getObject(i+4)));
  } 
}
rs.close();st.close();con.close();

}

catch(SQLException se)

{ System.out.println(Erro (Conexao2):+se.getMessage());

}

}

}

<img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=9" title=":slight_smile:" class="emoji" alt=":slight_smile:"> falow
GraveDigger

Isso aqui tah mto estranho :sad:

To usando esse código:

try {
			Class.forName ( "sun.jdbc.odbc.JdbcOdbcDriver" );
			
			Connection con = 
				DriverManager.getConnection ( "jdbc:odbc:Teste", "", "" );
						
			Statement stmt = con.createStatement();
			
			String query = "SELECT COF_NAME, TOTAL FROM COFFEES " +
			   "WHERE COF_NAME LIKE 'Colombian'";
			
			ResultSet rs = stmt.executeQuery ( query );
									
			while (rs.next()) {
				String s = rs.getString(1);
				int n = rs.getInt(2);
				System.out.println(n + " pounds of " + s + " sold to date.");
			}
					
			rs.close();
			stmt.close();
			con.close();
		}

Aparentemente está certo neh?

Porém, quando execute, ele passa direto pelo meu while, como se rs.next() fosse false.

Parece, q quando eu re-executo meu programa, o cursor não volta pra posição 0.

Por q isso, deveria voltar pra 0 ?

Como eu mudo o ResultSet pra q ele permita q eu ande com o cursor tanto pra frente quanto pra trás?

ps: estou usando o access97.

Valeu

L
  1. Não executa o laço while por que o registro não existe;
  2. Não precisa mudar o comando, êle sempre vai pesquisar do ínicio
    para o fim.
Criado 1 de agosto de 2005
Ultima resposta 1 de ago. de 2005
Respostas 9
Participantes 5