Вставка выбранной строки jTable в базу данных нажатием кнопки

Я пытаюсь вставить данные из моего jTable в базу данных, нажав кнопку. Я получаю исключение, говоря, что количество столбцов не соответствует количеству значений в строке 1

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    try{
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/sms", "root", "");

        String query = "insert into attendance(regNo,name,sClass,attendance,date) values('"+regNo+"','"+names+"','"+sClass+"','"+attendance+"')";
        Statement st=connection.createStatement();

        int row=jTable_Display_Student.getSelectedRow();
        String regNo=(jTable_Display_Student.getValueAt(row, 0).toString());
        String names=(jTable_Display_Student.getValueAt(row, 1).toString());
        String sClass=(jTable_Display_Student.getValueAt(row, 2).toString());
        String attendance=(jTable_Display_Student.getValueAt(row, 3).toString());



        st.executeUpdate(query);

       JOptionPane.showMessageDialog(null, "Selected Rows Submitted Successfully.");
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(null,e.getMessage());
    }
}

Любая помощь будет принята с благодарностью.

Этот код не компилируется. И этот код не может привести к тому исключению. Думаю, у вас другая версия. А по поводу проблемы, которую вы опубликовали: что это исключение пытается вам сказать?

f1sh 29.11.2018 13:16

Это потому, что есть пять полей, и вы отправляете только четыре значения в своем запросе.

Lublaut 29.11.2018 13:18

5 столбцов в regNo,name,sClass,attendance,date, но только 4 значения приведены в values('"+regNo+"','"+names+"','"+sClass+"','"+attendance+"'‌​) - дата отсутствует ...

user85421 29.11.2018 13:29

но как-то странно: вы создаете команду SQL, а после этого загружаете значения в переменные - Java так не работает. Когда он выполняет строку String query = ...., значения переменных в этот момент используются для создания строки. Переменная запроса не изменится, если переменные затем будут изменены (не говоря уже о том, что вы ДОЛЖНЫ объявить переменные перед использованием ...)

user85421 29.11.2018 13:34

@CarlosHeuberger, поэтому я сказал, что код не компилируется. Переменные используются до их объявления.

f1sh 29.11.2018 13:35

@ f1sh а значит я не могу повторить? очевидно, он мог бы скомпилировать и выполнить его, иначе это не сгенерирует ЭТО исключение ...

user85421 29.11.2018 13:36

Хорошо, эти четыре поля, которые я перечислил, находятся в jtable, а переменная даты - в jdatechooser. Мне трудно вставить данные из jTable в базу данных, нажав кнопку отправки. Если есть другой способ сделать это, я был бы признателен за помощь, пожалуйста, включите код

Cliffton afande 30.11.2018 06:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
68
2

Ответы 2

В этой части вашего кода:

    String query = "insert into attendance(regNo,name,sClass,attendance,date) values('"+regNo+"','"+names+"','"+sClass+"','"+attendance+"')";

У вас 5 столбцов

 (regNo,name,sClass,attendance,date)

и всего 4 значения для их заполнения

values('"+regNo+"','"+names+"','"+sClass+"','"+attendance+"')

Итак, вам нужно добавить date, который вам не хватает

Я сопоставил столбцы со значениями, и теперь я получаю исключение: «Обработка данных: данные слишком длинные для столбца 'regNo' в строке 1, но значение в этой ячейке представляет собой однозначное число

Cliffton afande 30.11.2018 07:49

При попытке использовать SQL используйте PreparedStatement. Код легче читать и меньше подвержен ошибкам.

Базовый пример для начала:

String sql = "INSERT INTO Page (Name, Title) VALUES (?, ?)";
PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, nameValue );
stmt.setString( 2, titleValue );
stmt.executeUpdate();

Надеюсь, вы легко сможете сказать:

  1. количество столбцов, которые вы обновляете, и, следовательно, количество значений, которые необходимо передать в оператор SQL.
  2. вам не нужно беспокоиться обо всех разделителях для этих значений.

Хотя я мог бы использовать подготовленный оператор, но он работает только при вводе данных из других компонентов, таких как текстовое поле и поле со списком. Как указать столбцы таблицы с помощью prepareStatement

Cliffton afande 30.11.2018 07:53

То же, что и в примере кода. Вы используете метод getValueAt (...) JTable.

camickr 30.11.2018 16:59

Другие вопросы по теме