PreparedStatement Gigante, Possivel?

Estou recebendo um erro ao tentar executar um sql com 69 campos, o problema é que da o erro.

java.sql.SQLException: Parameter index out of range (60 > number of parameters, which is 59).
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3326)
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3310)
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3352)
        at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3296)

Segue o código abaixo

public boolean salvar(DupCliente d) {
        Connection conn = Conexao.getInstance().getConnection();
        boolean r = false;
        String dataCad = d.getDataCad();
        String dataRev = d.getDataRev();
        String dataCom = d.getDataCom();
        String dataSal = d.getDataSal();
        String dataAlt = d.getDataAlt();
        String dataCadMont = "";
        String diaCad = dataCad.substring(0, 2);
        String mesCad = dataCad.substring(3, 5);
        String anoCad = dataCad.substring(6, 9);
        if (!diaCad.equals("  ")) {
            dataCadMont = anoCad + "-" + mesCad + "-" + diaCad;
        }
        String dataRevMont = "";
        String diaRev = dataRev.substring(0, 2);
        String mesRev = dataRev.substring(3, 5);
        String anoRev = dataRev.substring(6, 9);
        if (!diaRev.equals("  ")) {
            dataRevMont = anoRev + "-" + mesRev + "-" + diaRev;
        }
        String dataComMont = "";
        String diaCom = dataCom.substring(0, 2);
        String mesCom = dataCom.substring(3, 5);
        String anoCom = dataCom.substring(6, 9);
        if (!diaCom.equals("  ")) {
            dataComMont = anoCom + "-" + mesCom + "-" + diaCom;
        }
        String dataSalMont = "";
        String diaSal = dataSal.substring(0, 2);
        String mesSal = dataSal.substring(3, 5);
        String anoSal = dataSal.substring(6, 9);
        if (!diaSal.equals("  ")) {
            dataSalMont = anoSal + "-" + mesSal + "-" + diaSal;
        }
        String dataAltMont = "";
        String diaAlt = dataAlt.substring(0, 2);
        String mesAlt = dataAlt.substring(3, 5);
        String anoAlt = dataAlt.substring(6, 9);
        if (!diaAlt.equals("  ")) {
            dataAltMont = anoAlt + "-" + mesAlt + "-" + diaAlt;
        }
        
        try {
            String sql = "INSERT INTO dupcliente (empresa, numero, nome, mercado, endereco, complemento, bairro, cep, cidade," +
                    "estado, telefone, fax, cnpj, inscricao, limite, dataCad, dataRev, dataCom, dataSal, maiorSaldo, valorUltCom," +
                    "suframa, regiao, contato, seqCnpj, pessoa, tipo, status, contaCtb, contaGer, exporta, saldo, email, codCidade," +
                    "site, usuCad, usuRev, usuAlt, dataAlt, tipoNota, codTrans, formaPag, condPag11, condPag12, condPag13, condPag14,"+
                    " condPag15, condPag16, formaPag2, condPag21, condPag22, condPag23, condPag24, condPag25, condPag26, tipoFrete, repAssist," +
                    "comAssist, negocioTab, codTab, desconto, geraNotaDeb, pais, ddd, prefixo, numTel, faxDdd, faxPrefixo, faxNumTel)" +
                    "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            PreparedStatement sta = conn.prepareStatement(sql);
            sta.setInt(1, d.getEmpresa());
            sta.setInt(2, d.getNumero());
            sta.setString(3, d.getNome());
            sta.setInt(4, d.getMercado());
            sta.setString(5, d.getEndereco());
            sta.setString(6, d.getComplemento());
            sta.setString(7, d.getBairro());
            sta.setInt(8, d.getCep());
            sta.setString(9, d.getCidade());
            sta.setString(10, d.getEstado());
            sta.setString(11, d.getTelefone());
            sta.setString(12, d.getFax());
            sta.setFloat(13, d.getCgc());
            sta.setString(14, d.getInscricao());
            sta.setFloat(15, d.getLimite());
            sta.setString(16, dataCadMont);
            sta.setString(17, dataRevMont);
            sta.setString(18, dataComMont);
            sta.setString(19, dataSalMont);
            sta.setFloat(20, d.getMaiorSaldo());
            sta.setFloat(21, d.getValUltCompra());
            sta.setString(22, d.getSuframa());
            sta.setInt(23, d.getRegiao());
            sta.setString(24, d.getContato());
            sta.setInt(25, d.getSeqCnpj());
            sta.setString(26, d.getPessoa());
            sta.setInt(27, d.getTipo());
            sta.setInt(28, d.getStatus());
            sta.setInt(29, d.getContaCtb());
            sta.setInt(30, d.getContaGer());
            sta.setInt(31, d.getExporta());
            sta.setFloat(32, d.getSaldo());
            sta.setString(33, d.getEmail());
            sta.setInt(34, d.getCodCidade());
            sta.setString(35, d.getSite());
            sta.setString(36, d.getUsuCad());
            sta.setString(37, d.getUsuRev());
            sta.setString(38, d.getUsuAlt());
            sta.setString(39, dataAltMont);
            sta.setInt(40, d.getTipoNota());
            sta.setInt(41, d.getCodTrans());
            sta.setInt(42, d.getFormaPag());
            sta.setInt(43, d.getCondPag11());
            sta.setInt(44, d.getCondPag12());
            sta.setInt(45, d.getCondPag13());
            sta.setInt(46, d.getCondPag14());
            sta.setInt(47, d.getCondPag15());
            sta.setInt(48, d.getCondPag16());
            sta.setInt(49, d.getFormaPag2());
            sta.setInt(50, d.getCondPag21());
            sta.setInt(51, d.getCondPag22());
            sta.setInt(52, d.getCondPag23());
            sta.setInt(53, d.getCondPag24());
            sta.setInt(54, d.getCondPag25());
            sta.setInt(55, d.getCondPag26());
            sta.setInt(56, d.getTipoFrete());
            sta.setInt(57, d.getRepAssist());
            sta.setFloat(58, d.getComAssist());
            sta.setInt(59, d.getNegocioTab());
            sta.setInt(60, d.getCodTab());
            sta.setFloat(61, d.getDesconto());
            sta.setString(62, d.getGeraNotaDev());
            sta.setInt(63, d.getPais());
            sta.setInt(64, d.getDdd());
            sta.setInt(65, d.getPrefixo());
            sta.setInt(66, d.getNumTel());
            sta.setInt(67, d.getFaxDdd());
            sta.setInt(68, d.getFaxPrefixo());
            sta.setInt(69, d.getFaxNumTel());
            sta.executeUpdate();
            sta.close();
            r = true;
        } catch (SQLException e) {
            e.printStackTrace();
            r = false;
        }
        return r;
    }

Aqui você definiu 59 parâmetros. (Eu contei!)
Ponha mais “?,” para obter mais parâmetros.

Nossa eu contei 3 vezes e confundia 59 com 69, acho que preciso de ferias…

Se quiser pegue um interpretador de linguagem de script, pode ser groovy ou ruby, e digite 69 times ",? ", que ele vai imprimir essa String 69 vezes. Daí é copiar e colar.

O meu método de fazer as coisas não é contar. O método mais imbecil é este aqui:

  1. Crie uma string com 10 “?,”. Acho que mesmo cansado você consegue contar até 10.

?,?,?,?,?,?,?,?,?,?,

  1. Agora, pegue essa string “?,?,?,?,?,?,?,?,?,?,” e a copie 7 vezes

?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,

  1. Agora, tire um parâmetro.

?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?

Pronto, você tem 69 “?,”, sem ter de contar muito. Só usar um pouco a cabeça.

Como ja citaram lança Exception pq tem mais parametros do que o mencionado no PreparedStatement, ex.:

INSERT INTO TABELA (nome, rg, cpf) values (?,?,?)
O numero de campos da tabela deve ser igual ao interrogações (?) um detalhe importante é que a contagem do PreparedStatement é sempre a partir de 1;

[code] ps.setString(1, variavel1);
ps.setInt(2, variavel2);
ps.setInt(3, variavel3);

ps.execute();[/code]

Eu sei que são detalhes que a maioria ja conhece mas é bom lembrar. :smiley:
[]'s