我正在开发n层Java应用程序,当实现insert方法时,出现此错误: (conn = 146)列数与第1行的值数不符
我正在使用mariadb数据库和逻辑DAO-View模型
代码如下:
DAO:
try {
Statement st = conex.getConnection().createStatement();
st.executeQuery("INSERT INTO abas001 (abas_cod, abas_cnt, abas_vol, abas_und) VALUES ('"
+ miAbasto.getAbas_cod() + "', '"
+ miAbasto.getAbas_cnt() + "', '"
+ miAbasto.getAbas_vol() + "', '"
+ miAbasto.getAbas_und() + "', '"
+ "')");
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null,
"No se Registró, verifique la consola para ver el error",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
//
以及查看代码:
botonGuardar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
pabascnt = Integer.parseInt(txtcant.getText());
pabasvol = Double.parseDouble(txtvol.getText());
AbastosDao abdao = new AbastosDao();
AbastosLog parabl = new AbastosLog();
parabl.setAbas_cod(pabascod);
parabl.setAbas_cnt(pabascnt);
parabl.setAbas_vol(pabasvol);
parabl.setAbas_und(pabasund);
abdao.registrarAbasto(parabl);
mostrarDatosConTableModel();
}
});
}
错误在哪里?
我认为该错误正在向DAO发送参数,但我不知道。
答案 0 :(得分:0)
这里是将其转换为使用PreparedStatement的方式,这还将解决许多潜在的问题,包括防止SQL注入以及所插入值的数据类型映射。建议您查看documentation on using PreparedStatements。同时,我提供了一个简单的示例,说明如何使用预处理语句。
PreparedStatement ps = conex.getConnection().prepareStatement(
"INSERT INTO abas001 (abas_cod, abas_cnt, abas_vol, abas_und) VALUES (?,?,?,?)");
try {
ps.setObject(1, miAbasto.getAbas_cod());
ps.setObject(2, miAbasto.getAbas_cnt());
ps.setObject(3, miAbasto.getAbas_vol());
ps.setObject(4, miAbasto.getAbas_und());
int rowsInserted = ps.executeUpdate();
} . . .
finally {
ps.close();
}
请务必注意,PreparedStatement可以重用,这样做可以提高应用程序的性能,这一点很重要。此外,如果您的应用程序倾向于对大量输入中的每个元素重复调用此方法,则可以考虑重构以执行批处理。我将把所有这些留给您,并添加必要和适当的错误处理。