mysql for java中的语句

mysql for java中的语句,java,mysql,sql,database,Java,Mysql,Sql,Database,我猜这个错误在判刑中,但我不知道如何纠正它= public long guardar(PedidoDTO obj) throws SQLException { PedidoDTO dto = new PedidoDTO(); String url="jdbc:mysql://127.0.0.1:3306/capacitacion?user=capacitacion&password=password"; try { Connection con = DriverManager

我猜这个错误在判刑中,但我不知道如何纠正它=

public long guardar(PedidoDTO obj) throws SQLException {

PedidoDTO dto = new PedidoDTO();
String url="jdbc:mysql://127.0.0.1:3306/capacitacion?user=capacitacion&password=password";

try {
    Connection con = DriverManager.getConnection(url);
    String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(NULL,'" +  obj.getId() + "," +  obj.getFecha() + ","+ obj.getTotal() + "," + obj.getFolio() + "')";
        PreparedStatement s =  con.prepareStatement(sentenciaSQL);
        s.executeUpdate();
        for(PedidoDetalleDTO detalle:obj.getPedidoDetalle()){
            dto.getId();
            dto.getFecha();
            dto.getTotal();
            dto.getFolio();
        }con.close();
} catch (SQLException e) {
    System.out.println(e);
}
return dto.getId();
}

您正试图在四个字段中插入五条数据。您的查询将尝试将
NULL
插入
id
obj.getId()
插入
fecha
,等等。看起来删除值列表中的
NULL
是一个很好的第一步。

对于PreparedStatement来说,这不是一个好的用法,应该是这样的:

String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?, ?, ?, ?)";
PreparedStatement s =  con.prepareStatement(sentenciaSQL);
s.setInt(1, obj.getId());
s.setDate(2, obj.getFecha());
s.setDouble(3, obj.getTotal());
s.setString(4, obj.getFolio());
String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?,?,?,?)";
PreparedStatement s =  con.prepareStatement(sentenciaSQL);
s.setInt(1,obj.getId());
s.setDate(2,obj.getFecha());
s.setInt(3,obj.getTotal());
s.setString(4,obj.getFolio().toString());
s.execute();
顺便问一下,您为什么要使用此块代码:

for(PedidoDetalleDTO detalle:obj.getPedidoDetalle()){
    dto.getId();
    dto.getFecha();
    dto.getTotal();
    dto.getFolio();
}

看起来您希望使用相同的方法在表中添加订单详细信息(detalles de la orden/pedido),但这种方法行不通。如果您发布您的功能需求以帮助您解决真正的问题,这将是一件好事。

仔细查看。您所犯的错误是,sentenciaSQL中的第一个和最后一个变量都有单独的、未闭合的记号(在ID和对开本上):

而且

obj.getFolio() + "')";
因为您已经在使用一个准备好的语句,所以最好的方法是将值添加为参数,如下所示:

String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?, ?, ?, ?)";
PreparedStatement s =  con.prepareStatement(sentenciaSQL);
s.setInt(1, obj.getId());
s.setDate(2, obj.getFecha());
s.setDouble(3, obj.getTotal());
s.setString(4, obj.getFolio());
String sentenciaSQL = "INSERT INTO capacitacion.pedido (id, fecha, total, folio) VALUES(?,?,?,?)";
PreparedStatement s =  con.prepareStatement(sentenciaSQL);
s.setInt(1,obj.getId());
s.setDate(2,obj.getFecha());
s.setInt(3,obj.getTotal());
s.setString(4,obj.getFolio().toString());
s.execute();
注意,我假设您的Id和Total是整数。您需要用实际的数据类型替换


此外,如果不关心更新了多少行,可以使用execute()而不是executeUpdate()。任何一个都可以。

。。。错误?这也是纠正错误的好办法。请添加stacktrace和/或您收到的错误消息。否则,我们只能猜测问题出在哪里。这不是问题的答案,但您应该在创建连接后将代码包装在
try…finally
结构中,将
con.close()
语句放入
finally
块中。否则,可能会在关闭连接之前引发异常(即,连接将成为悬空资源)。如果读取代码,则不需要stacktrace。另外,大家会注意到,错误不仅仅在于错误的SQL用法,主要问题是OP需要实现什么以及他/她缺乏做这件事的知识。但是,如果我喜欢在我的数据库中自动:递增“id”,我需要放入sintax或我没有提到的?,因为现在我正在这样做,但即使是那些仍然不起作用=(String sentenciaSQL=“INSERT INTO capacacion.pedido VALUES(“+obj.getFecha()+”,“+obj.getFolio()+”);语句s=con.createStatement();s.executeUpdate(sentenciaSQL);for(pedidodetaledto detalle:obj.getPedidoDetalle()){dto.getId();dto.getFecha();dto.getFolio());现在我把它当作我要展示给你们看的,但问题仍然是,它可能是什么?String SeventionAsql=“插入到capacacion.pedido(fecha,folio)值(“+obj.getFecha()+”,“+obj.getTotal()+”,“+obj.getFolio()+”);很抱歉,我已经把这个(fecha,total,folio)还有一个问题我不知道它是否与我的数据库的自动增量有关?抱歉,我必须运行AFK。看看BryceAtNetwork23的解决方案。它比字符串插值更明确,在很多方面(性能、可读性、可维护性等)都很好.回答得好Luiggi!看起来你比我早输入了2分钟。哇,你太棒了,伙计,现在我的问题是:参数索引超出范围(1>参数数量,为0)。我不知道这是否与我有“id”有关在我的数据库中有一个自动递增?我怎样才能修复它?@user1617806基于你的新代码,你的代码仍然是错误的,你没有按照我答案中的更正进行操作。