我无法在我的数据库中插入值(java 不显示错误)

Posted

技术标签:

【中文标题】我无法在我的数据库中插入值(java 不显示错误)【英文标题】:I can't insert values in my database (java does not show error) 【发布时间】:2020-08-07 13:50:02 【问题描述】:

我做了几次测试,视图值都保存在模型中,但不传到数据库中。 screen输入的值被console打印出来很完美,但是在输入数据库的时候,并没有完成,也无法判断错误。

DAO 类。

public class ProyectoDAO 
ConexionSQL conectar = new ConexionSQL();
Connection con;
PreparedStatement ps;
ResultSet rs;

    public int insert(Proyecto p) 
        String sql = "INSERT INTO proyecto (name, status, duration, advance) VALUES (?,?,?,?)";
        try 

            con = conectar.getConexionSQL();
            ps=con.prepareStatement(sql);
            ps.setString(2, p.getNombre());
            //ps.setString(2, "Test");
            ps.setInt(3, p.getStatus());
            ps.setInt(5, p.getDuracion());
            ps.setInt(6, p.getAvance());
            int registro = ps.executeUpdate();      
            return 1;

         catch(Exception e)

        
        return 0;
    

控制器项目

public class Cproyecto extends ConexionSQL 

    Proyecto p = new Proyecto();
    Vproyecto vp = new Vproyecto();
    Version ver = new Version();
    Connection con = getConexionSQL();
    ProyectoDAO pdao = new ProyectoDAO();
    VersionDAO vdao = new VersionDAO();

    public Cproyecto(Proyecto p) 
        super();
        this.vp.addRegistrarListener(new guardarValor()); 
        this.vp.addActualizarListener(new actualizarValor());
        this.vp.addBuscarListener(new buscarValor());
    

    public void initProyecto() 
        vp.setVisible(true);
        vp.textID.setText(String.valueOf(p.getCod())); //Esto debe aparecer al abrir Registrar
    

    // Register
        class guardarValor implements ActionListener 
            public void actionPerformed(ActionEvent e) 
                try 

                    if (vp.textNombre.getText().isEmpty() || vp.textVersion.getText().isEmpty() || vp.textAvance.getText().isEmpty())
                        JOptionPane.showMessageDialog(null, "Debe rellenar todos los campos");
                    else 
                        //Save values
                        p.setNombre(vp.textNombre.getText());
                        p.setStatus(vp.comboEstado.getSelectedIndex());
                        p.setDuracion(vp.comboDuracion.getSelectedIndex());
                        p.setAvance(Integer.valueOf(vp.textAvance.getText()));
                        ver.setNameVersion(vp.textVersion.getText());
                        int rp = pdao.insertar(p);
                        int rv = vdao.insertarVer(ver,p);                       

                         //end else
                 catch (Exception error) 
                    JOptionPane.showMessageDialog(null, "Ha ocurrido un error, consulte a Soporte Técnico");
                    vp.limpiar();
                
             //end void
         //end class   

连接

public class ConexionSQL 
    Statement stm;
    Connection con;


    public Connection getConexionSQL() 
        try 
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/analisisqa","root","");
            //Statement stm = con.createStatement();
        
        catch(ClassNotFoundException exc) 
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, "No Conectado");
        
        catch (SQLException ex) 
            Logger.getLogger(ConexionSQL.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "No Conectado");
        
        return con;

    

我的主要。


public class Main 

    public static void main(String[] args) 

        ConexionSQL con = new ConexionSQL();
        // TODO Auto-generated method stub
        Proyecto p = new Proyecto();
        Prueba pru = new Prueba();
        Version ver = new Version();

        CPrueba cpru = new CPrueba(pru, ver, p);
        Cproyecto cp = new Cproyecto(p);

        ProyectoDAO pdao = new ProyectoDAO();
        PruebaDAO prudao = new PruebaDAO();
        VersionDAO verdao = new VersionDAO();

        Cprincipal cprincipal = new Cprincipal(p, pru, ver, cpru, cp, con, pdao, prudao, verdao);
        cprincipal.initPrincipal();

    



【问题讨论】:

java does not show error - 如果你忽略 catch 块中的异常,那就不足为奇了 你有一个空的catch块catch(Exception e) 你需要在那里做一些事情来使错误可见 也许你必须改变你的数据库读写规则以允许包括你自己在内的某些用户改变数据。 【参考方案1】:

您的 SQL 查询似乎有 4 个参数:

String sql = "INSERT INTO proyecto (name, status, duration, advance) VALUES (?,?,?,?)";

但你的设置不同

ps.setString(2, p.getNombre());
//ps.setString(2, "Test");
ps.setInt(3, p.getStatus());
ps.setInt(5, p.getDuracion());
ps.setInt(6, p.getAvance());

然后你忽略错误

 catch(Exception e)


首先打印异常(或让它传播)。它会给你更多的细节。 然后修复参数索引:

ps.setString(1, p.getNombre());
ps.setInt(2, p.getStatus());
ps.setInt(3, p.getDuracion());
ps.setInt(4, p.getAvance());

【讨论】:

从打印异常开始 我建议将e.printStackTrace() 添加到空的“catch”块中。【参考方案2】:

您的查询如下所示:

String sql = "INSERT INTO proyecto (name, status, duration, advance) VALUES (?,?,?,?)";

但是你设置了错误的参数:

 ps.setString(2, p.getNombre());
 //ps.setString(2, "Test");
 ps.setInt(3, p.getStatus());
 ps.setInt(5, p.getDuracion());
 ps.setInt(6, p.getAvance());

修复参数索引:

public class ProyectoDAO 
ConexionSQL conectar = new ConexionSQL();
Connection con;
PreparedStatement ps;
ResultSet rs;

public int insert(Proyecto p) 
    String sql = "INSERT INTO proyecto (name, status, duration, advance) VALUES (?,?,?,?)";
    try 

        con = conectar.getConexionSQL();
        ps=con.prepareStatement(sql);
        ps.setString(1, p.getNombre());
        //ps.setString(2, "Test");
        ps.setInt(2, p.getStatus());
        ps.setInt(3, p.getDuracion());
        ps.setInt(4, p.getAvance());
        int registro = ps.executeUpdate(); 


        if(registro >= 1)
           return 1;
        else
          return 0;
        

     catch(Exception e)
            e.printStackTrace();
    
    return 0;


【讨论】:

连接没有关闭,函数返回后PreparedStatement也没有关闭。您的“解决方案”会造成内存泄漏。 @rkosegi 你说写但是现在,我不专注于关闭连接,如果连接关闭,内存泄漏不会发生。我们使用 finally 块来关闭 finally 块中的连接我们编写了 con.close() & ps.close() 并处理了相应的异常。

以上是关于我无法在我的数据库中插入值(java 不显示错误)的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的 android 应用程序中使用 XAMPP 服务器在我的数据库中插入值

POST 方法不起作用但未显示任何错误

无法在我的数据库中插入大量寄存器

当应用程序从此活动关闭时,崩溃并显示错误 - “包裹:无法编组值...”

如果不获取插入功能,则无法找到要使用的正确值

无法在我的 Access 数据库中插入图像