Как мы можем использовать prepareStatement ()? - PullRequest
1 голос
/ 15 декабря 2009

Я использую prepareStatement (), когда идентификатор является ключом моей таблицы SQL, и он будет создан SQL, и я хочу использовать этот оператор: (что я должен написать вместо X в первом столбце таблицы SQL (напоминание : SQL создаст его автоматически)

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)

Ответы [ 4 ]

8 голосов
/ 15 декабря 2009

Если вы указали тип этого столбца как int и автоинкремент, например,

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

тогда вам вообще не нужно указывать какое-либо значение, поэтому вы можете начинать подготовленные параметры оператора с 1 с имени.

 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);

Обратите внимание, что, как уже говорили другие, вы должны включать имена столбцов, какими бы они ни были.

1 голос
/ 15 декабря 2009

Вам не нужно указывать это самостоятельно, поэтому вы можете просто оставить это в стороне. Но вы должны сами указать столбцы, например

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

в противном случае БД не будет знать, куда вставлять значения, поскольку отсутствует один столбец.

0 голосов
/ 15 декабря 2009

У меня всего 2 цента, что если вы хотите сгенерированный идентификатор, вы можете позвонить

pstmt.getGeneratedKeys( );

Если он вернет что-либо действительное, зависит от вашей реализации драйвера JDBC.

0 голосов
/ 15 декабря 2009

Вы не устанавливаете параметр 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);

Вы должны указывать имена столбцов в явном виде, в противном случае вы зависите от порядка в операторе create таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...