SQL Server - trabalhando com tabelas de sessão #

2 respostas
A

Olá,
preciso de uma ajuda referente a utilização de laços que executam query’s em tabelas de sessão (#) no SQL Server.
A aplicação ao ser acionada por um WebService cria uma conexão com o banco de dados SQL Server e cria as tabelas temporárias por sessão necessárias.
Em um determinado processo é necessário que duas query’s sejam abertas selecionando dados de duas tabelas temporária da sessão, este processo ocorre na mesma sessão, conforme código abaixo:

queryDataCodigos = "SELECT REGISTROANS," +
            "VERSAOPADRAO " +
            "FROM #TMP_CABECALHO " +
            "WHERE CHAVE = ?";
    
    queryCodigos = conn.prepareStatement(queryDataCodigos);
    queryCodigos.setInt(1, chave);
    resultSetCodigos = queryCodigos.executeQuery();
    
    if(resultSetCodigos.next()){            
        if(status == 1){
            queryDataCabecalho = "SELECT ORDEM," +
                    "CHAVE," +
                    "CODIGOERRO," +
                    "DESCRICAOERRO," +
                    "OBSERVACAO " +
                    "FROM #TMP_MENSAGENSDEERRO " +
                    "WHERE CHAVE = ?";
            queryCabecalho = conn.prepareStatement(queryDataCabecalho);
            queryCabecalho.setInt(1, chave);
            resultSetCabecalho = queryCabecalho.executeQuery();

Ao executar a última linha apresentada a aplicação retorna erro informando que não encontrou o objeto #TMP_MENSAGENSDEERRO.
Só que realizando um close na queryCodigos antes de executar a segunda query o sistema executa sem erro a rotina.

Eu preciso realizar mais de uma consulta sem que as query’s sejam fechadas.

Alguém poderia me ajudar.

Obrigado e abraços

2 Respostas

_fs

Nunca experimentei esse tipo de problema.

Achei que você estivesse reutilizando PreparedStatements ou ResultSets, mas não é o caso.

De qualquer forma, pelo que vi você não precisa iterar sobre o primeiro ResultSet, apenas faz “if( rs.next() )”, então porque não extrai de uma vez todos os dados que precisa desse ResultSet e o fecha antes de executar os outros processos?

E, para desencargo de consciência, você está utilizando o driver da Microsoft? Se sim, esqueça-o e use o JTDS. É menos bugado e mais performático.

ps.: quando for postar código, coloque-o entre as tags [ code]seu código[ /code], assim ele fica formatado ;D

A

Muito obrigado por responder,
vou alterar o driver para JTDS e fazer os testes.
Neste exemplo de código a solução que adotei foi a que vc enviou, a de extrair os dados. Mas existem trechos onde preciso realmente iterar, e este é meu grande problema.
A priori alterarei o driver, e se tiver mais alguma idéia agradeço.

Valew

Criado 5 de novembro de 2007
Ultima resposta 6 de nov. de 2007
Respostas 2
Participantes 2