0

エラーはセンテンシアSQLにあると思いますが、修正方法がわかりません=

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();
}
4

3 に答える 3

1

よく見てください。あなたが犯したエラーは、sentenciaSQLの最初と最後の変数がそれぞれ(IDとFolioに)閉じていない唯一の目盛りを持っていることです:

VALUES(NULL,'" +  obj.getId()

と...

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は整数であると仮定していることに注意してください。実際のデータ型に置き換えたいと思うでしょう。

また、更新された行数を気にしない場合は、executeUpdate()の代わりにexecute()を使用できます。どちらでも構いません。

于 2012-08-23T20:26:56.690 に答える
1

これは 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());

ところで、なぜこのブロック コードを使用しているのですか。

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

同じ方法を使用してテーブルに注文の詳細 (detalles de la orden/pedido) を追加したいようですが、この方法では機能しません。実際の問題を解決するのに役立つ機能要件を投稿するとよいでしょう。

于 2012-08-23T20:24:56.683 に答える
0

5 つのデータを 4 つのフィールドに挿入しようとしています。クエリは、、 などに挿入しようとします。値リストの を削除することがNULL最初のステップとして適切なようです。idobj.getId()fechaNULL

于 2012-08-23T20:22:06.847 に答える