[英]Java SQL-statement problems
我在數據庫的列表中有一個表,列為NR,FNAME,SNAME和ADDRESS。 我還有一個具有所有這些屬性的人員類。 現在,我想將一個Person添加到數據庫中。
Statement stmt = anslutning.createStatement();
stmt.executeUpdate("INSERT INTO person (nr, fnamn, snamn, address) VALUES (" + p.getNr() + "," + p.getFname()+ "," + p.getSname()+","+ p.getAddress() + ")");
如果p.getFname是“漢克”,那么我會收到此錯誤消息:
mar 08, 2014 11:30:44 FM dblab.PersonAccessor addPerson
Allvarlig: null
java.sql.SQLException: Column not found: HANK
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
at dblab.PersonAccessor.läggTillPerson(PersonAccessor.java:82)
at dblab.LäggTill.actionPerformed(LäggTill.java:139)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
漢克
我認為您需要使用單引號插入String值,如下所示:
Statement stmt = anslutning.createStatement();
stmt.executeUpdate("INSERT INTO person (nr, fnamn, snamn, address) VALUES (" + p.getNr() + ",'" + p.getFname()+ "','" + p.getSname()+"', '"+ p.getAddress() + "')");
我建議不要使用Statement
,使用PreparedStatement
像這樣:
PreparedStatement stmt = anslutning.prepareStatement("INSERT INTO person (nr, fnamn, snamn, address) VALUES (?, ?, ?, ?)");
stmt.setString(1, p.getNr());
stmt.setString(2, p.getFname());
stmt.setString(3, p.getSname());
stmt.setString(4, p.getAddress());
永遠不要做:
stmt.executeUpdate("INSERT INTO person (nr, fnamn, snamn, address)
VALUES (" + p.getNr() + "," + p.getFname()+ "," + p.getSname()+","+ p.getAddress() + ")");
您看到的錯誤是因為p.getFname()
未加引號,因此MySQL假定它是列名。
改用准備好的語句 :
PreparedStatement stm = anslutning.prepareStatement("INSERT INTO person (nr, fnamn, snamn, address) VALUES (?, ?, ?, ?)");
stm.setInt(1, p.getNr());
stm.setString(2, p.getFname());
stm.setString(3, p.getSname());
stm.setString(4, p.getAddress());
stm.executeUpdate();
您必須在查詢中包含引號。 像這樣:
"INSERT INTO person (nr, fnamn, snamn, address) VALUES (" + p.getNr() + ",'" + p.getFname()+ "','" + p.getSname()+"','"+ p.getAddress() + "')"
始終嘗試使用PreparedStatement,它消除了為varchars添加quotes(')的困惑
我假設nr是int,其余所有(fnamn,snamn,address)都是varchars
所以通過使用preparedstatement
PreparedStatement stmt = anslutning.prepareStatement("insert into person(nr, fnamn, snamn, address) values(?,?,?,?)");
stmt.setInt(1,p.getNr());
stmt.setString(2,p.getFname());
stmt.setString(3,p.getSname());
stmt.setString(4,p.getAddress());
stmt.executeUpdate();
您應該更改並鍵入以獲取解決方案:
Statement stmt = anslutning.createStatement();
stmt.executeUpdate("INSERT INTO
person (nr, fnamn, snamn, address)VALUES (?,?,?,?)");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.