2012-08-23 40 views
0

我猜的錯誤是在sentenciaSQL,但我不知道如何解決它=句子在mysql中的Java

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

...錯誤?對錯誤也是一個好主意。 – vector

+0

請添加堆棧跟蹤和/或您收到的錯誤消息。否則,我們將只能猜測出問題所在。 – cyroxx

+1

不是你的問題的答案,但是你應該在'try ... finally'結構中創建連接之後包裝代碼,並將'con.close()'語句放入'finally'塊中。否則,在關閉連接之前可能會拋出異常(即連接將成爲懸掛資源)。 –

回答

0

您正在嘗試插入數據的五件分爲四個領域。您的查詢將嘗試將NULL插入到id,obj.getId()fecha等中。它看起來像刪除您的值列表中的NULL將是一個好的第一步。

+0

,但如果我喜歡汽車:在我的數據庫中的「id」增量,我需要把sintax或我沒有提到?,因爲現在我在這樣做,但即使你仍然不工作=(String sentenciaSQL = \t \t 「INSERT INTO capacitacion .pedido VALUES(」 + obj.getFecha() \t \t + 「」 + obj.getFolio()+ 「)」; \t \t \t \t \t \t \t聲明S = CON .createStatement(); \t \t \t s。的executeUpdate(sentenciaSQL); \t \t \t爲(PedidoDetalleDTO detalle:obj.getPedidoDetalle()){ \t \t \t \t dto.getId(); \t \t \t \t dto.getFecha(); \t \t \t \t dto.getFolio(); – user1617806

+0

現在我把它像我要告訴你,但問題仍然存在,它可能是什麼? – user1617806

+0

字符串sentenciaSQL = \t \t 「INSERT INTO capacitacion .pedido(出生日期,對開)VALUES(」 \t \t \t + obj.getFecha(+) 「 」+ obj.getTotal()+「,」 + obj.getFolio( )+「)」; – user1617806

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),但不會以這種方式工作。如果您發佈功能要求以幫助您解決實際問題,那就太好了。

+0

好回答Luiggi!看起來你在我做之前2分鐘就完成了打字。 – Aaron

+0

哇,你真棒,現在我有這個問題:參數索引超出範圍(1>參數數量,這是0)。我不知道它是否有什麼要做,我有我的數據庫上的自動增量「ID」?我該如何解決它? – user1617806

+0

@ user1617806基於你的新的[重複問題](http://stackoverflow.com/q/12100246/1065197),你的代碼仍然是錯誤的,你沒有按照我的答案張貼更正。 –

1

仔細觀察。您所做的錯誤是,在sentenciaSQL每個第一和最後一個變量具有唯一的,未封閉的刻度線(上ID和對開):

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和總爲整數。您將需要用實際的數據類型進行替換。另外,如果您不關心已更新了多少行,則可以使用execute()而不是executeUpdate()。任何一個都沒問題。