Begin Transaction

20 respostas
V

Olá pessoal gostaria de saber como usar o Begin transaction…
eu não sei se realmente eh preciso …
gostaria de salvar um arquivo em uma tabela no banco primeiro e dpois em outra … estou tentando da seguinte forma :

public void ProdItens(Produtos p, NotaFiscal nf){
        if(conn){
        	if(connection != null){
        		try{
                             ps = connection.prepareStatement("BEGIN TRANSACTION TRAN_01 " +
                                     "insert into notaFiscal(numero, data, serie, valor)values(?,?,?,?)" +
                                     "insert into ProdutoItens(numeroNotaFiscal, codigoProduto, qtdLevou, Total) values(?,?,?,?) " +
                                     "COMMIT TRANSACTION TRAN_01 ");
                           
                            ps.setInt(1,nf.getNumero());
                            ps.setString(2,nf.getData());
                            ps.setString(3,nf.getSerie());
                            ps.setString(4,nf.getValor());
                            
                            ps.setInt(1,p.getNumeroNotaFiscal());
                            ps.setString(2,p.getCodigo());
                            ps.setString(3,p.getQtdLevou());
                            ps.setString(4,p.getTotal());
                            
                            ps.executeUpdate();                            
                            
                        }
                        catch(SQLException e){
        			System.out.println(e.getMessage());
        		}
        	}        
        }		
    }

ta dando esse erro
Campo COUNT incorreto

Obrigado … abraço

20 Respostas

B

para fazer uma trasnção vc pode usar o java tb…

tipo antes de começar a dar os comandos de sql usa o

(db é o obejto de conexão)
db.setAutoCommit(false);

e depois de tudo o :

db.setAutoCommit(true);

e boa…

V

ah sim … mto mais facil neh rs ??
vlw …=]
mas agora ta dando um erro diferente…
tah dando o seguinte …

O atributo não pode ser definido agora

o meu codigo no botão eh esse …

String data = "1";
        String serie = "123";
        String valor = "20";
        int tabela = jTable2.getRowCount();
        
        for(int j = 0 ; j<tabela ;j++ ){

            String numero =  jTextField2.getText();
            String codigo = String.valueOf(jTable2.getModel().getValueAt(j,0));
            String qtdLevou = String.valueOf(jTable2.getModel().getValueAt(j,2));
            String Total = String.valueOf(jTable2.getModel().getValueAt(j,4));
            
            Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
            NotaFiscal nf = new NotaFiscal(numero, data, serie, valor);
            
            banco.ProdItens(nf, pd);
        }

//eu to passando o numero que eu pego no jTextField pras duas tabelas, tem que ser assim neh ??
abraço

B

tipo…ki erro tah dando ?

nun entendi…cola o erro ai ke fica mais facil…

V

esse:

O atributo não pode ser definido agora

V

o que será em rs??

V

alguem poderia me ajudar…
obrigado …
:smiley:

B

vc declarou a varivel ?

V

qual variavel???

V

serah que alguem poderia me dar uma luz ???
nao sei como fazer…=/

A

Basta dar connection.setAutoCommit(false) antes de fazer qualquer coisa.

E fazer connection.commit(); quando tiver acabado de fazer o que quiser e for dar commit;

No JDBC não é necessário chamar o begin transaction, o driver faz isso sozinho quando o setAutoCommit é false.

Abs

V

Bom dia …
eu colokei assim mas nao ta dando certo

public void ProdItens(NotaFiscal nf, Produtos p){
        if(conn){
        	if(connection != null){
        		try{
                            connection.setAutoCommit(false);
                             ps = connection.prepareStatement( "insert into notaFiscal(numero, data, serie, valor)values(?,?,?,?)" +
                                     "insert into ProdutoItens(numeroNotaFiscal, codigoProduto, qtdLevou, Total) values(?,?,?,?)");
                              connection.commit();    
                         
                                                      
                           
                            ps.setInt(1,nf.getNumero());
                            ps.setString(2,nf.getData());
                            ps.setString(3,nf.getSerie());
                            ps.setString(4,nf.getValor());
                            
                            ps.setInt(1,p.getNumeroNotaFiscal());
                            ps.setString(2,p.getCodigo());
                            ps.setString(3,p.getQtdLevou());
                            ps.setString(4,p.getTotal());
                            
                            ps.executeUpdate(); 
                            
                           
                            JOptionPane.showMessageDialog(null,"Sucesso!!!!mah");
                        }
                        catch(SQLException e){
        			System.out.println(e.getMessage());
        		}
        	}        
        }		
    }

classe onde eu pego os valores…

int tabela = jTable2.getRowCount();
        
        for(int j = 0 ; j<tabela ;j++ ){
            
            String numero =  nf.getText();
            String data1 =  data.getText();
            String serie1 =  serie.getText();
            String valor1 =  valor.getText();
            String codigo = String.valueOf(jTable2.getModel().getValueAt(j,0));
            String qtdLevou = String.valueOf(jTable2.getModel().getValueAt(j,2));
            String Total = String.valueOf(jTable2.getModel().getValueAt(j,4));
            
            Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
            NotaFiscal nf = new NotaFiscal(numero, data1, serie1, valor1);
            
            banco.ProdItens(nf, pd);
        }

o Erro eh esse … ===>O atributo não pode ser definido agora
Obrigado …

A

cara, o teu código apareceu cortado aqui. Tenta colocar ele sem cortar pq não to conseguindo ler a parta da query!

E o commit() vai depois do executeUpdate(); (vc so quer comitar DEPOIS da atualizacao, certo?)

Vlw!

V

saiu cortado?

coloquei dpois e ta msm coisa …

public void ProdItens(NotaFiscal nf, Produtos p){
        if(conn){
        	if(connection != null){
        		try{
                            connection.setAutoCommit(false);
                             ps = connection.prepareStatement( "insert into notaFiscal(numero, data, serie, valor)values(?,?,?,?)" +
                                     "insert into ProdutoItens(numeroNotaFiscal, codigoProduto, qtdLevou, Total) values(?,?,?,?)");
                                
                         
                                                      
                           
                            ps.setInt(1,nf.getNumero());
                            ps.setString(2,nf.getData());
                            ps.setString(3,nf.getSerie());
                            ps.setString(4,nf.getValor());
                            
                            ps.setInt(1,p.getNumeroNotaFiscal());
                            ps.setString(2,p.getCodigo());
                            ps.setString(3,p.getQtdLevou());
                            ps.setString(4,p.getTotal());
                            
                            ps.executeUpdate(); 
                            connection.commit(); 
                           
                            JOptionPane.showMessageDialog(null,"Sucesso!!!!mah");
                        }
                        catch(SQLException e){
        			System.out.println(e.getMessage());
        		}
        	}        
        }		
    }

tipo sao duas tabelas … uma notaFiscal e a outra ProdutoItens…
a chave primaria de notaFisca entra como chave estrangeira em ProdutosItens… esssa chave eh o numero …
não sei se estou fazendo da forma correta… eu posso pegar do msm lugar e inserir nas 2 tabelas ??

String numero =  nf.getText();
            String data1 =  data.getText();
            String serie1 =  serie.getText();
            String valor1 =  valor.getText();
            String codigo = String.valueOf(jTable2.getModel().getValueAt(j,0));
            String qtdLevou = String.valueOf(jTable2.getModel().getValueAt(j,2));
            String Total = String.valueOf(jTable2.getModel().getValueAt(j,4));
            
            Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
            NotaFiscal nf = new NotaFiscal(numero, data1, serie1, valor1);
            
            banco.ProdItens(nf, pd);

essa parte eu pego do campo nf com a String numero e mando inserir nas duas… ta certo ??

vlw abraço…

A

Cara, vc tem que botar cada insert em um prepared statement diferente. Ficaria mais ou menos assim:

public void ProdItens(NotaFiscal nf, Produtos p){
    if(conn){
        if(connection != null){
            try{
                connection.setAutoCommit(false);
                ps = connection.prepareStatement( "insert into notaFiscal(numero, "+
                        " data, serie, valor)values(?,?,?,?)");
                PreparedStatement ps2 = connection.prepareStatement("insert into "+
                        " ProdutoItens(numeroNotaFiscal, codigoProduto, qtdLevou, "+
                        "  Total) values(?,?,?,?)");
                                 
                                                                                                            
                ps.setInt(1,nf.getNumero());
                ps.setString(2,nf.getData());
                ps.setString(3,nf.getSerie());
                ps.setString(4,nf.getValor());
                             
                ps2.setInt(1,p.getNumeroNotaFiscal());
                ps2.setString(2,p.getCodigo());
                ps2.setString(3,p.getQtdLevou());
                ps2.setString(4,p.getTotal());
                             
                ps.executeUpdate(); 
                ps2.executeUpdate();
                connection.commit(); 
                            
                JOptionPane.showMessageDialog(null,"Sucesso!!!!mah");
            } catch(SQLException e){
         	      System.out.println(e.getMessage());
         		}
        }        
    }		
}

Ah, é uma boa prática nao deixar as linhas do seu código passarem de 80 colunas, por isso quebrei as strings das queries.

V

rss… vlw nao sabia dessa pratica…
puts cara, nao ta dando certo ainda…
tipo qnd dou salvar… o tanto de linha que tem na JTable eu tanto que
escreve o erro …
serah tem q por alguma coisa fora do for?
vlw :thumbup:

V

tenta assim mas tb nao da..

String codigo = "";
      String qtdLevou = "";
      String Total = "";
      
             String numero =  nf.getText();
             String data1 =  data.getText();
             String serie1 =  serie.getText();
             String valor1 =  valor.getText(); 
             
      int tabela = jTable2.getRowCount();
        
        for(int j = 0 ; j<tabela ;j++ ){
            
          codigo += String.valueOf(jTable2.getModel().getValueAt(j,0));
          qtdLevou += String.valueOf(jTable2.getModel().getValueAt(j,2));
          Total += String.valueOf(jTable2.getModel().getValueAt(j,4));
        }
          
          Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
          NotaFiscal nf = new NotaFiscal(numero, data1, serie1, valor1);
          
          banco.ProdItens(nf, pd);
se souber ...

obrigado..


:D

V

alguem sabe o que pode ser??
vlw

V

Bom dia ...
consegui tirando o connection.setAutoCommit(false);
e o connection.commit();

public void ProdItens(NotaFiscal nf, Produtos p){
     if(conn){
         if(connection != null){
             try{
                                  ps = connection.prepareStatement( "insert into notaFiscal(numero, "+
                         " data, serie, valor) values(?,?,?,?)");
                 PreparedStatement ps2 = connection.prepareStatement("insert into "+
                         " ProdutoItens(numeroNotaFiscal, codigoProduto, qtdLevou, "+
                         "  Total) values(?,?,?,?)");
                                  
                                                                                                             
                 ps.setInt(1,nf.getNumero());
                 ps.setString(2,nf.getData());
                 ps.setString(3,nf.getSerie());
                 ps.setString(4,nf.getValor());
                              
                 ps2.setInt(1,p.getNumeroNotaFiscal());
                 ps2.setString(2,p.getCodigo());
                 ps2.setString(3,p.getQtdLevou());
                 ps2.setString(4,p.getTotal());
                              
                 ps.executeUpdate(); 
                 ps2.executeUpdate();
                 
                                            
                 JOptionPane.showMessageDialog(null,"Sucesso!!!!mah");
             } catch(SQLException e){
          	      System.out.println(e.getMessage());
          		}
         }        
     }		
 }

soh q eu to com um problema ...
tipo se a tabela tiver soh uma linha ele faz normal agora se tiver mais ele soh adiciona a primeira ...

eu to tentando colocar
Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
dentro do for.. mas ai da erro ele nao encontra o objeto pd no
banco.ProdItens(nf, pd);

alguem sabe alguma forma de fazer ... da pra instanciar metodos como static ??

String codigo = "";
      String qtdLevou = "";
      String Total = "";
      
      String numero =  nf.getText();
      String data1 =  data.getText();
      String serie1 =  serie.getText();
      String valor1 =  valor.getText(); 
             
      int tabela = jTable2.getRowCount();
        
        for(int j = 0 ; j<tabela ;j++ ){
            
          codigo += String.valueOf(jTable2.getModel().getValueAt(j,0));
          qtdLevou += String.valueOf(jTable2.getModel().getValueAt(j,2));
          Total += String.valueOf(jTable2.getModel().getValueAt(j,4));
          
          Produtos pd = new Produtos(numero, codigo, qtdLevou, Total);
        
        }
       NotaFiscal nf = new NotaFiscal(numero, data1, serie1, valor1);
       banco.ProdItens(nf, pd);

vlw

V

alguem sabe alguma forma de resolver isso ??
vlw

V

Não sei como resolver isso …
alguem me ajuda??
vlw

Criado 12 de dezembro de 2006
Ultima resposta 19 de dez. de 2006
Respostas 20
Participantes 3