Begin Transaction

20 respostas
Veneno

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

biozit

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…

Veneno

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

biozit

tipo…ki erro tah dando ?

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

Veneno

esse:

O atributo não pode ser definido agora

Veneno

o que será em rs??

Veneno

alguem poderia me ajudar…
obrigado …
:smiley:

biozit

vc declarou a varivel ?

Veneno

qual variavel???

Veneno

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

Veneno

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!

Veneno

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.

Veneno

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:

Veneno

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

Veneno

alguem sabe o que pode ser??
vlw

Veneno

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

Veneno

alguem sabe alguma forma de resolver isso ??
vlw

Veneno

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