Access - Estado de cursor Inválido

6 respostas
G

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

Porém gera o seguinte erro:

Estado de cursor inválido

O que significa isso e como posso arrumar?

Valeu

6 Respostas

M
Bem troque tuas linhas:
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();
por estas:
while ( result.next()) {
         int column = data.getColumnCount(); 
          
         for ( int i = 1; i <= column; i++ ) 
            output.append ( result.getObject ( i ) ); 
                      
         System.err.println ( output.toString() ); 
 }

não testei, mas acredito que resolve o teu problema.

:okok:

M

quando eh gerado um resultset por “default” ele fica posicionado no registro “beforefirst” entao … se vc quiser acessar o primeiro registro antes precisa chamar o metodo “.next” do resultset … par ir ao primeiro registro … se nao essa msg “ESTADO DE CURSOR INVALIDO” ira aparecer … ela represente que o cursor ou esta no beforefirst ou no afterlast ! o metodo “.next” retorna “false” se estiver em qualquer um desses dois estados … se nao retorna true !

G

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

M

vc tem certeza que essa consulta que vc fez esta retornado algum registro ?
Pq senao vai passar direto pelo whili mesmo pois nao ha nenhum registro !
tenta fazer com uma consulta simples sem condicao nenhuma !

M

quando vc chamaro metodo CrateSatement do
passa estes parametros conforme abaixo …
isso deve resolver o problema de navegacao que vc tem

stmt = conexao.createStatement(ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_SCROLL_INSENSITIVE);

G

“MAMS”:
quando vc chamaro metodo CrateSatement do
passa estes parametros conforme abaixo …
isso deve resolver o problema de navegacao que vc tem

stmt = conexao.createStatement(ResultSet.CONCUR_UPDATABLE, ResultSet.TYPE_SCROLL_INSENSITIVE);

Amigo, fiz isso q vc sugeriu ( na verdade as constantes estão invertidas ) e mesmo assim não funcionou.

Acredito q possa ser algum problema no meu banco, pode ser isso?

[]'s

Criado 1 de agosto de 2005
Ultima resposta 2 de ago. de 2005
Respostas 6
Participantes 3