2009-12-15 78 views
0

我使用prepareStatement()當id是我的SQL表的一個鍵,它將由SQL創建,我想使用這個語句:(我應該寫什麼,而不是X在SQL表的第一列(提醒: SQL自動創建)我們如何使用prepareStatement()?

File file = new File(pathFile); 
      FileInputStream input = new FileInputStream(file); 


      query = ("insert into birthtable VALUES(?,?,?,?,?,?,?,?)"); 
      pstmt = (PreparedStatement) conn.prepareStatement(query); 
      pstmt.setInt(1,**X**) 
      pstmt.setString(2, name); 
      pstmt.setString(3, family); 
      pstmt.setString(4, fatherName); 
      pstmt.setString(5, mName); 
      pstmt.setString(6, dOfBirth); 
      pstmt.setString(7, pOfBirth); 
      // Method used to insert a stream of bytes 
      pstmt.setBinaryStream(8, input); 




      pstmt.executeUpdate(); 

我做了什麼,你都這麼說 但我有這個例外?

java.sql.SQLException: Column count doesn't match value count at row 1 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922) 
    at database.Manager.addBirth(Manager.java:76) 
    at AdminGUI.AddNewBornInformation.submit(AddNewBornInformation.java:358) 
    at AdminGUI.AddNewBornInformation.setButtonActionPerformed(AddNewBornInformation.java:282) 
    at AdminGUI.AddNewBornInformation.access$800(AddNewBornInformation.java:28) 
    at AdminGUI.AddNewBornInformation$9.actionPerformed(AddNewBornInformation.java:139) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.Component.processMouseEvent(Component.java:6038) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) 
    at java.awt.Component.processEvent(Component.java:5803) 
    at java.awt.Container.processEvent(Container.java:2058) 
    at java.awt.Component.dispatchEventImpl(Component.java:4410) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) 
    at java.awt.Container.dispatchEventImpl(Container.java:2102) 
    at java.awt.Window.dispatchEventImpl(Window.java:2429) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
+1

你不應該''(PreparedStatement)''強制轉換。 –

+0

我沒有,NetBeans爲我做了!!!!? – Johanna

+1

但你仍然有權說不。 – Joel

回答

7

如果您已指定該列如int和自動遞增例如類型

`ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 

那麼你根本不需要提供任何值,所以你可以用name來啓動準備好的語句params。

query = ("insert into birthtable (nameCol, familyCol, fatherNameCol, mNameCol, dOfBirthCol, pOfBirthCol, inputCol) VALUES(?,?,?,?,?,?,?)"); 
     pstmt = (PreparedStatement) conn.prepareStatement(query); 
     pstmt.setString(1, name); 
     pstmt.setString(2, family); 
     pstmt.setString(3, fatherName); 
     pstmt.setString(4, mName); 
     pstmt.setString(5, dOfBirth); 
     pstmt.setString(6, pOfBirth); 
     // Method used to insert a stream of bytes 
     pstmt.setBinaryStream(7, input); 

請注意,正如其他人所說,您必須包含列名稱,無論它們是什麼。

+0

我們有8個問號,然後我從1開始,那麼八個問號的值在哪裏? – Johanna

+0

你需要刪除一個 - 所以在你的查詢中只有七個 – Joel

0

您沒有設置在準備好的聲明id參數假設你使用自動遞增,列名是有效的:

query = ("insert into birthtable (name, family, fatherName, mName, dOfBirth, pOfBirth, input) VALUES(?,?,?,?,?,?,?)"); 
pstmt = conn.prepareStatement(query); 
pstmt.setString(1, name); 
pstmt.setString(2, family); 
pstmt.setString(3, fatherName); 
pstmt.setString(4, mName); 
pstmt.setString(5, dOfBirth); 
pstmt.setString(6, pOfBirth); 
pstmt.setBinaryStream(7, input); 

你應該明確,否則你依靠的順序陳述列名錶創建語句。

+0

,你有7列8個問號? – Johanna

+0

@Johanna - 是的。固定?和idx#。 –

1

你不需要自己指定它,所以你可以把它留下。但是,您應該自己指定列,例如

"INSERT INTO tablename (columnname1, columnname2, columnname3) VALUES (?, ?, ?);" 

否則數據庫將不知道插入值的位置,因爲有一列丟失。

+0

哇,我明白了,這是多麼棘手! – Johanna

-1

我唯一的2美分的是,如果你想有一個生成的ID,您可以撥打

pstmt.getGeneratedKeys(); 

如果它要返回任何合法的取決於你的JDBC驅動程序實現雖然。