domingo, 8 de abril de 2012

TRANSACCIONES JDBC JAVA

En esta ocasion veremos como realizar transacciones con JDBC en JSP(Java Server Page), bueno les pongo el codigo para luego explicar un poco lo sencillo de manejar transacciones con JDBC.

      try{
      _xArrItems = _xCadenaDetallePedido.split("-");
      _xArrCodigoProducto = _xArrItems[1].split("@");
      _xArrNombreProducto = _xArrCodigoProducto[1].split("<");
      _xArrCantidadProducto = _xArrNombreProducto[1].split(">");

        //_xArrNombreProducto = _xArrNombreProducto[0].split("$");
      System.out.println("Producto : " + _xArrNombreProducto[0]);
      //_xArrNombreProducto = _xArrCodigoProducto[0].split("$");

      System.out.println("Items : " + _xArrItems[0]);
      System.out.println("Items[1] : " + _xArrItems[1]);
      System.out.println("CodProd : " + _xArrCodigoProducto[0]);
      System.out.println("CodProd[1] : " + _xArrCodigoProducto[1]);
      System.out.println("Producto : " + _xArrNombreProducto[0]);
      System.out.println("Producto[1] : " + _xArrNombreProducto[1]);
      System.out.println("Cantidad[0] : " + _xArrCantidadProducto[0]);
      System.out.println("Cantidad[1] : " + _xArrCantidadProducto[1]);

      System.out.println("Nuevo : ");

      try{

     _xItems = _xArrItems[0];
      _xCodigoProducto = _xArrCodigoProducto[0];
      _xNombreProducto = _xArrNombreProducto[0];
      _xCantidadProducto = _xArrCantidadProducto[0];

      _xArrItemsResultado = _xItems.split("|");
      _xArrCodigoProductoResultado = _xCodigoProducto.split("|");
      _xArrNombreProductoResultado = _xNombreProducto.split("|");
      _xArrCantidadProductoResultado = _xCantidadProducto.split("|");

      System.out.println("Items: " +_xItems);
      System.out.println("CodigoProducto: " +_xCodigoProducto);
      System.out.println("NombreProducto: " +_xNombreProducto);
      System.out.println("CantidadProducto: " +_xCantidadProducto);

         System.out.println("Items Length: " + _xArrItems.length);

         Vector _xItemVector = new Vector();
         Vector _xItemCodProducto = new Vector();
         Vector _xItemCantidadProducto = new Vector();

        int _xPosicionProducto = 0;
        int _xPosicionItemsProducto = 0;
        int _xPosicionCodigoProducto = 0;
        int _xPosicionCantidadProducto = 0;


      }catch(Exception ex){
      System.out.println("Fallo for: " + ex.getMessage());
      }
        oConnection.setAutoCommit(false);

        //Guardamos la cabezera en Nuestra Primera Invocacion

           oCallableStatement = oConnection.prepareCall("{call  PA_INSERT_PEDIDOCABECERA(?,?,?,?)}") ;
           // Se indica que el primer interrogante es de salida.
           oCallableStatement.registerOutParameter(1,Types.NUMERIC);
           // Se pasa un parámetro en el segundo interrogante
           oCallableStatement.setString(2,"1");
           // Se pasa un parámetro en el tercer interrogante.
           oCallableStatement.setString(3,"1");
           // Se pasa un parámetro en el cuarto interrogante.
           oCallableStatement.setString(4,"20");

           oCallableStatement.execute();


        //Guardamos el detalle en Nuestra Segunda Invocacion

        for(int i = 0; i <= _xArrItems.length -1;i++){

           if(!_xArrItems[i].trim().equals("") && !_xArrItems[i].trim().equals("|") ){

           oCallableStatement = oConnection.prepareCall("{call  PA_INSERT_PEDIDODETALLE(?,?,?,?)}") ;
           // Se indica que el primer interrogante es de salida.

           oCallableStatement.setString(1,"1");
           // Se pasa un parámetro en el segundo interrogante
           oCallableStatement.setString(2,_xArrItems[i]);
           // Se pasa un parámetro en el tercer interrogante.
           oCallableStatement.setString(3,_xArrCodigoProducto[i]);
           // Se pasa un parámetro en el cuarto interrogante.
           oCallableStatement.setString(4,_xArrCantidadProducto[i]);

           oCallableStatement.execute();
           }

           }
           //_xCodigoPedidoCabecera = oCallableStatement.getString(1);
           //mensaje = st.getString(1);
           System.out.print("el mensaje  es "+_xCodigoPedidoCabecera );
           oCallableStatement.close();
           oConnection.commit();

      }catch(Exception ex){
          oConnection.rollback();
      System.out.println("Error en Transaccion: " +ex.getMessage());
      }

       oConnection.setAutoCommit(true);




como podemos ver tenemos la conexion setAutoCommit en modo False, porque cuando se crea una conexion por JDBC por defecto el modo de confirmacion de AUTOMATICO osea cuando realizamos un execute cada sentencia se maneja como si fuese una transaccion, pero hay ocasiones como esta donde queremos guardar un maestro detalle osea una composicion, para guardar dos o mas sentencias solo necesitamos desactivar el modo de confirmacion automatica   oConnection.setAutoCommit(FALSE) y de esta manera podemos executar x sentencia DML,  hasta cuando le indiquemos explicitamente que se va ha confirmar osea oConnection.setAutoCommit(true), espero les alla quedado claro.



Saludos



No hay comentarios:

Publicar un comentario