DAO中插入的计数列不一致

时间:2018-10-03 17:03:26

标签: java

我正在开发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发送参数,但我不知道。

1 个答案:

答案 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可以重用,这样做可以提高应用程序的性能,这一点很重要。此外,如果您的应用程序倾向于对大量输入中的每个元素重复调用此方法,则可以考虑重构以执行批处理。我将把所有这些留给您,并添加必要和适当的错误处理。