簡體   English   中英

Java SQL陳述式問題

[英]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());

全面了解PreparedStatement

永遠不要做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM