Java + access - Estado de cursor inválido

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

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

Atenciosamente,

Paulo

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();
	
	
}

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?

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.

[quote=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.[/quote]

Usar essese métodos como?

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());
}
}
}
:slight_smile: falow

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());
}
}
}
:slight_smile: falow

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

  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.