1

Estoy intentando agregar datos a una base de datos mediante un botón pero al momento de ingresar los datos me arroja un error en la parte de Prepared Statement y mi sentencia SQL la he probado en mi servidor local (phpmyadmin) y ha funcionado a la perfección, y no he podido avanzar en mi proyecto por ese error.

Les dejo parte de mi código:

Esto es al momento de presionar el botón de agregar a la base de datos

    conexionBD cc = new conexionBD();
    Connection cn=cc.conectar;
    String sql="";

    if(rbnHerraOfi.isSelected())
        tip=rbnHerraOfi.getText();
    else
        tip=rbnArtPape.getText();
    sql="INSERT INTO productos (Articulo,Precio_compra,Precio_venta,Stock_min,TipoArticulo,Cantidad) VALUES (?,?,?,?,?,?)";

    try {
         PreparedStatement pst = cn.prepareStatement(sql);
         pst.setString(1,txt_NombrePro.getText());
         pst.setDouble(2,Double.parseDouble(txtPrecioCompraPro.getText()));
         pst.setDouble(3,Double.parseDouble(txtPrecioVentaPro.getText()));
         pst.setInt(4,Integer.parseInt(txtStockMinimo.getText()));
         pst.setString(5,tip);
         pst.setInt(6,Integer.parseInt(txtCantidadPro.getText()));

         int n=pst.executeUpdate();
         if(n>=0){
             JOptionPane.showMessageDialog(null,"Registros Guardados con Exito");
              limpiar();
         }

    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,""+ex);

    }
        `

Y esto es lo que tengo en mi clase de conexión

public class conexionBD {
    Connection conectar=null;

    public Connection conectar() {

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            conectar=DriverManager.getConnection("jdbc:mysql://localhost/papeleria","root","");
            JOptionPane.showMessageDialog(null, "Conectado correctamente");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error al conectarse a la base de datos"+e);
        }
        return conectar;
    }
}

Este es el error que recibo:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at pepeleria2.Admin2.btnGuardarProActionPerformed(Admin2.java:650)

La línea 650 es justamente donde esta el PreparedStatement.

OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
Sebastian
  • 11
  • 2
  • Mira [ask] para que tu pregunta sea mejor recibida. También, aprovecha y haz el [tour] para entender mejor cómo funcionamos y de paso obtener tu primera [medalla](https://es.stackoverflow.com/help/badges)! – gbianchi Oct 22 '17 at 06:43
  • por favor, aclara que error estas recibiendo – gbianchi Oct 22 '17 at 06:43
  • Usa el boton [edit] y agrega la informacion a la pregunta – gbianchi Oct 22 '17 at 06:45
  • Lo siento soy nuevo :) – Sebastian Oct 22 '17 at 06:47
  • Los comentarios no deben usarse para discusiones extendidas; esta conversación ha sido [trasladada a un chat](http://chat.stackexchange.com/rooms/67564/discussion-on-question-by-sebastian-no-puedo-agregar-un-registro-a-mi-base-de-da). – lois6b Oct 24 '17 at 08:06
  • Si el error es en esa línea, PreparedStatement pst = cn.prepareStatement(sql);, tiene que ser que con es null, revísalo. – Pablo Fradua Oct 24 '17 at 08:32

1 Answers1

-1

La sentencia String sql=""; crea una instrucción SQL vacía para, según el bucle if, iniciarla o no según si rbnHerraOfi.isSelected() o no. La sentencia if funciona perfectamente a pesar de no llevar el código interior en corchetes porque solo contiene una sentencia. Pero la sentencia else contiene exactamente 2 líneas. Se desaconseja no introducir corchetes, porque como en tu caso, si excedes el número de sentencias mayor que 1, sólo ejecutará la primera. Añade corchetes a esa sentencia if de esta manera:

if(rbnHerraOfi.isSelected()) {
        tip=rbnHerraOfi.getText();
   } else {
        tip=rbnArtPape.getText();
        sql="INSERT INTO productos (Articulo,Precio_compra,Precio_venta,Stock_min,TipoArticulo,Cantidad) VALUES (?,?,?,?,?,?)";
   }
Víctor
  • 826
  • 8
  • 15
  • Lo siento amigo eso no soluciona el erro, sigue marcando en la linea del PreparedStatement, pero gracias – Sebastian Oct 22 '17 at 07:12
  • 1
    Victor, mas alla de que tu apreciacion sobre los corchetes sea correcta (siempre es mejor ponerlos), que tendria que ver con el error? si lo haces de esta forma, sql pasaria a veces totaltmente vacio y nadie lo llenaria. – gbianchi Oct 22 '17 at 14:52
  • La relación es que permite pasar la sentencia sql vacía a la declaración de la línea 650, lo mismo sucede si rbnHerraOfi no es seleccionado. Pero... es evidente que falta información para hablar con seguridad – Víctor Oct 22 '17 at 15:17
  • @gbianchi Si no pones corchetes a la sentencia solo ejecuta la primera instrucción que contenga aunque contenga más. Es decir, ese código siempre pasa una sentencia sql vacía – Víctor Oct 25 '17 at 09:37