我无法在我的数据库中插入值(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 服务器在我的数据库中插入值