Erro de execução de consulta no sql server 2008 [Resolvido]

1 resposta
renato1010

Olá pessoal.

Estou com um problema que ainda não tinha visto.
Tenho um banco de dados no SQL Server 2008 e estou tentando inserir alguns registros.
Porém, quando mando executar a aplicação, acontece o seguinte:

Se estou usando o driver jtds, acontece o seguinte erro:
java.sql.SQLException: Invalid option value '1008' for parameter holdability
Se estou usando o driver jdbc da microsoft, da o seguinte erro:
com.microsoft.sqlserver.jdbc.SQLServerException: O valor de suspensão 1.008 não é válido

É o mesmo erro. Porém, nunca tinha visto e não sei porque ele está acontecendo.

Segue o código para facilitar a compreensão e uma possível ajuda.
try {

            stmt = connFirebird.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.FETCH_UNKNOWN);
            connNovoBanco.setAutoCommit(false);
            //connNovoBanco.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT); //isso eu tentei colocar mas não deu em nada, acontece o mesmo erro
            



           ResultSet rset = stmt.executeQuery("select codturno,"+
                     "case when (codusuario is null) then 9999 else codusuario end as codusuario,"+
                     "case when (codprod is null) then 999 else codprod end as codprod,"+
                     "case when (codloja is null) then 9999 else codloja end as codloja,"+
                     "abertura,fechamento,afericao,"+
                     "case when (dtabertura is null) then NULL else dtabertura end as dtabertura,"+
                     "case when (dtfechamento is null) then NULL else dtfechamento end as dtfechamento "+
                     "from turno");

            PreparedStatement ps = connNovoBanco.prepareStatement ("insert into vd_turno values (?,?,?,?,?,?,?,?,?);");


          while(rset.next())
            {

                               
                           Statement stm =             connNovoBanco.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY,ResultSet.CONCUR_UPDATABLE);

                            String sql = "SELECT CASE WHEN ("+rset.getInt("CODPROD")+" NOT IN (SELECT id_bico FROM cd_bico)) THEN 999 ELSE "+rset.getInt("CODPROD")+" END AS CODPROD,"+
                                        "CASE WHEN ("+rset.getInt("CODLOJA")+" NOT IN (SELECT id_loja FROM cf_loja)) THEN 9999 ELSE "+rset.getInt("CODLOJA")+" END AS CODLOJA,"+
                                        "CASE WHEN ("+rset.getInt("CODUSUARIO")+" NOT IN (SELECT id_usuario FROM cd_usuario)) THEN 9999 ELSE "+rset.getInt("CODUSUARIO")+" END AS CODUSUARIO";

                            ResultSet rs;
                            rs = stm.executeQuery(sql);

                            rs.first();
                            aux_codprod = (Integer)rs.getInt("CODPROD");
                            aux_loja = (Integer)rs.getInt("CODLOJA");
                            aux_usuario = (Integer)rs.getInt("CODUSUARIO");
                            
                            
                ps.setInt(1, rset.getInt("CODTURNO"));
                ps.setInt(2, aux_usuario);
                ps.setInt(3, aux_codprod);
                ps.setInt(4, aux_loja);
                ps.setFloat(5, rset.getFloat("ABERTURA"));
                ps.setFloat(6, rset.getFloat("FECHAMENTO"));
                ps.setFloat(7, rset.getFloat("AFERICAO"));
                ps.setTimestamp(8, rset.getTimestamp("DTABERTURA"));
                //ps.setString(8, dataa);
                //ps.setString(9, dataf);
                ps.setTimestamp(9, rset.getTimestamp("DTFECHAMENTO"));
                ps.addBatch();
                                
                System.out.println("Turno:" + (Integer) rset.getInt("CODTURNO") + " Produto: " + (String) rset.getString("CODPROD") + "  Abertura: " + (Timestamp) rset.getTimestamp("DTABERTURA") + " Fechamento: " + (Timestamp) rset.getTimestamp("DTFECHAMENTO") + " FOI INSERIDO NA STRING!" + "  Registro --> Nº " + cont_aux);

               cont_aux = cont_aux + 1;
            }
            //stmt_aux.executeBatch();
            System.out.println("Inserindo dados no banco");
            ps.executeBatch();
            connNovoBanco.commit();
            ps.close();
            ps = null;
            
            //System.out.println("String final: "+sql_insert.toString());
            stmt.close();
           } catch (SQLException ex) {
               JOptionPane.showMessageDialog(null, "Erro de inserção: "+ex);
                Logger.getLogger(teste_turno.class.getName()).log(Level.SEVERE, null, ex);
            }

Pelo que andei pesquisando, esse problema de holdability tem a ver com as propriedades ResultSet.HOLD_CURSORS_OVER_COMMIT ou ResultSet.CLOSE_CURSORS_AT_COMMIT. Encontrei nesse link [url]http://msdn.microsoft.com/en-us/library/ms378765.aspx[/url] porém não consegui evoluir. Não sei o que tenho que configurar e nem onde configurar para resolver esse problema.

Alguns esclarecimentos: O SQL Server está rodando local. Tenho esse mesmo banco rodando em PostgreeSQL e também em MySQL, nesses dois casos essa mesma aplicação funcionou normalmente, sem ter que fazer nenhuma alteração ou adaptação para um ou outro sgbd.

SQL Server 2008 Enterprise Edition
NetBeans 6.9.1
JDK 1.6 update 21
Windows 7 Ultimate

Driver jtds versão 1.2.5
Driver microsoft versão 3.0

Alguém já passou por isso ou tem alguma idéia de como resolver?

Desde já, agradeço a atenção.

1 Resposta

renato1010

Pessoal;

Consegui resolver o problema.

Apenas fiz as alterações abaixo, inserindo esses parâmetros dos resultsets na criação dos statements.

Feito isso, o problema foi resolvido.

Criado 5 de outubro de 2010
Ultima resposta 6 de out. de 2010
Respostas 1
Participantes 1