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:
java.sql.SQLException: Invalid option value '1008' for parameter holdability
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.