Begin Transaction

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

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…

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

tipo…ki erro tah dando ?

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

esse:

O atributo não pode ser definido agora

o que será em rs??

alguem poderia me ajudar…
obrigado …
:smiley:

vc declarou a varivel ?

qual variavel???

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

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

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 …

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!

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…

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.

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:

tenta assim mas tb nao da…

[code]
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);
     [/code]

se souber …

obrigado…

alguem sabe o que pode ser??
vlw

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 ??

[code]

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);[/code]

vlw

alguem sabe alguma forma de resolver isso ??
vlw