Problema ao usar JDBC para realizar consulta após executar um INSERT

5 respostas
Naruffy

Tenho o seguinte problema, eu realizo um INSERT, e logo após este eu realizo um SELECT, estea consulta é ordenado por um ORDER BY, se eu pegar esta consulta e executar direto na SQL Server ela vem correta, porém se eu executo pelas classe do JDBC o ultimo e o penultimo registro veem trocados. Mas isso só acontece quando a consulta é realizada após a inserção. Já troque a classe ResultSet pela por com.sun.rowset.CachedRowSetImpl e também ocorreu o mesmo problema, será um bug no JDBC?

Alguem já viu issu?

Grato.
[]s

5 Respostas

pboechat

Olá,

Que banco/driver está utilizando?

Abç

Naruffy

SQL Server com o driver jtds

Focao

qual é o order by ?

as vezes está pela coluna errada… como uma seguence… por exemplo

pboechat

Fiz um teste tolo, com uma base simples, SQL Server 2005 e jTDS 2.0.10. Não consegui simular o erro. Minha suspeita recai agora sobre seu SQL, como mencionado pelo usuário “Focão”.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

	/**
	 * @param args
	 */
	private static void printUsuarioTable() throws SQLException {
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select codigo from dbo.usuario order by 1");
		System.out.println("*****************");
		System.out.println("printing dbo.USUARIO");
		System.out.println("*****************");
		while (rs.next()) {
			System.out.print(" - codigo : " + rs.getInt(1) + " / ");
		}
		rs.close();
		stmt.close();
	}
	
	private static Integer getLastCodigoUsuario() throws SQLException {
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select max(codigo) from dbo.usuario");
		Integer lastCodigoUsuario = null;
		if (rs.next()) {
			lastCodigoUsuario = rs.getInt(1);
		}
		rs.close();
		stmt.close();
		return (lastCodigoUsuario == null) ? 0 : lastCodigoUsuario;
	}
	
	private static Connection conn;
	
	public static void main(String[] args) {
		try {
			Class.forName("net.sourceforge.jtds.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:jtds:sqlserver://xxx:1433/xxx","xxx","xxx");
			
			printUsuarioTable();
			
			
			System.out.println("*****************");
			System.out.println("inserting into dbo.USUARIO");
			System.out.println("*****************");
			Statement stmt = conn.createStatement();
			stmt.execute("insert into dbo.usuario values (" + (getLastCodigoUsuario()+1) + ", 1)");
			stmt.close();
			
			printUsuarioTable();
			
			conn.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Depois rodar o código durante

Naruffy

A consulta :

SELECT Tb_Ap.Codigo Cod_Ap, Tb_Rq.Codigo Cod_Rq, Tb_Ap.Cod_Passo, Tb_Ap.STATUS, Tb_Ap.Key, Tb_Ap.comment, Tb_Rq.comment_cancel, 
        Tb_Pa.Ordem, Tb_Rq.cod_requi, Tb_Per.Cod_Rq Cod_Tb_Per, Tb_Per.Nome Tb_Per, 
        CONVERT(VARCHAR, Tb_Ap.date_val, 103) + ' ' + CONVERT(VARCHAR, Tb_Ap.date_val, 108) date_val,
        CONVERT(VARCHAR, Tb_Ap.date_rev, 103) + ' ' + CONVERT(VARCHAR, Tb_Ap.date_rev, 108) date_rev,
        CONVERT(VARCHAR, Tb_Ap.date_lei, 103) + ' ' + CONVERT(VARCHAR, Tb_Ap.date_lei, 108) date_lei,
        CONVERT(VARCHAR, Tb_Ap.date_req, 103) + ' ' + CONVERT(VARCHAR, Tb_Ap.date_req, 108) date_req,
        Tb_Ap.date_req DATA_REQ,
        ISNULL(Tb_Ap.date_val, GETDATE()) DATA_VAL 
 FROM   Tb_Ap, V$Funf Tb_Per, Tb_Car, Tb_Pa, Tb_Rq 
 WHERE  Tb_Ap.Cod_Req = Tb_Car.Cod_Req
   AND  Tb_Rq.Codigo = Tb_Ap.Cod_Rq
   AND  Tb_Pa.CODIGO = Tb_Ap.Cod_Passo 
   AND  Tb_Ap.Cod_Funf = Tb_Per.Cod_Rq
   AND  Tb_Ap.Cod_Req = 8951
 ORDER BY DATA_REQ, DATA_VAL, Tb_Ap.Status

Só relembrando q a consulta só não funciona quando é executado no meu programa após realizar um insert

Criado 28 de janeiro de 2009
Ultima resposta 29 de jan. de 2009
Respostas 5
Participantes 3