The prepared statement has been finalized

860
05 июня 2017, 22:33

Доброго времени суток, товарищи! Уже несколько дней бьюсь над одной проблемой и не понимаю что я делаю не так.

Есть у меня форма добавления клиента в SQLite базу.

    <?xml version="1.0" encoding="UTF-8"?>
    <?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="230.0" prefWidth="273.0" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="addClientForm.clientFormController">
   <children>
      <JFXTextField fx:id="clientIDTextField" layoutX="14.0" layoutY="14.0" prefHeight="25.0" prefWidth="252.0" promptText="ID" />
      <JFXTextField fx:id="clientFioTextField" layoutX="14.0" layoutY="48.0" prefHeight="25.0" prefWidth="252.0" promptText="ФИО" />
      <JFXTextField fx:id="clientPhoneTextField" layoutX="14.0" layoutY="83.0" prefHeight="25.0" prefWidth="252.0" promptText="Номер телефона" />
      <JFXTextField fx:id="clientDiscountTextField" layoutX="14.0" layoutY="122.0" prefHeight="25.0" prefWidth="252.0" promptText="Процент скидки" />
      <JFXButton buttonType="RAISED" layoutX="14.0" layoutY="162.0" prefHeight="25.0" prefWidth="252.0" ripplerFill="#18db44" text="Создать" onAction="#addEvent" />
      <JFXButton  fx:id="exitButton" layoutX="14.0" layoutY="187.0" prefHeight="25.0" prefWidth="252.0" ripplerFill="#18db44" text="Выйти" onAction="#exitEvent" />
   </children>
</AnchorPane>

Ну и собственно есть контроллер этой формы.

package addClientForm;

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextField;
import helpers.SQLiteHelper;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class clientFormController {
    @FXML
    private JFXButton exitButton;
    @FXML
    private JFXTextField clientIDTextField;
    @FXML
    private JFXTextField clientFioTextField;
    @FXML
    private JFXTextField clientPhoneTextField;
    @FXML
    private JFXTextField clientDiscountTextField;

    @FXML
    public void exitEvent()
    {
        Stage stage = (Stage) exitButton.getScene().getWindow();
        stage.close();
    }
    @FXML
    public void addEvent()
    {
        Connection connection = helpers.SQLiteHelper.Connect();
        String sql = "INSERT INTO client(id,fio,phone,discount) VALUES (?,?,?,?)";
        try
        {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,Integer.parseInt(clientIDTextField.getText()));
            preparedStatement.setString(2,clientFioTextField.getText());
            preparedStatement.setString(3,clientPhoneTextField.getText());
            preparedStatement.setInt(4,Integer.parseInt(clientDiscountTextField.getText()));
            preparedStatement.executeUpdate();
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("Информация");
            alert.setHeaderText(null);
            alert.setContentText("Готово!");
            alert.showAndWait();
        }
        catch (SQLException exp)
        {
            System.out.println(exp);
        }
    }
}

Данный код работает и все в нем хорошо.

Однако есть у меня другая форма, которая по своей концепции и реализации практически не отличается от формы что выше. Код формы:

<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXComboBox?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.collections.*?>

<?import java.lang.String?>
<AnchorPane prefHeight="270.0" prefWidth="270.0" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="addAnyProductForm.productFormController">
   <children>
      <JFXComboBox fx:id="productComboBox" layoutX="14.0" layoutY="28.0" prefHeight="25.0" prefWidth="250.0" promptText="Выберите тип продукта">
         <items>
         <FXCollections fx:factory="observableArrayList">
            <String fx:value="Напитки"></String>
            <String fx:value="Пицца"></String>
            <String fx:value="Салаты"></String>
            <String fx:value="Cуши"></String>
         </FXCollections>
         </items>
      </JFXComboBox>
      <JFXTextField fx:id="productIdTextField" layoutX="14.0" layoutY="66.0" prefHeight="25.0" prefWidth="250.0" promptText="ID" />
      <JFXTextField fx:id="productNameTextField" layoutX="14.0" layoutY="103.0" prefHeight="25.0" prefWidth="250.0" promptText="Название" />
      <JFXTextField fx:id="productCountTextField" layoutX="14.0" layoutY="140.0" prefHeight="25.0" prefWidth="250.0" promptText="Кол-во" />
      <JFXTextField fx:id="productCostTextField" layoutX="14.0" layoutY="175.0" prefHeight="25.0" prefWidth="250.0" promptText="Цена" />
      <JFXButton layoutX="14.0" layoutY="209.0" prefHeight="25.0" prefWidth="250.0" text="Добавить" onAction="#addAction"/>
      <JFXButton fx:id="exitButton" layoutX="14.0" layoutY="234.0" prefHeight="25.0" prefWidth="250.0" text="Выход" onAction="#exitAction" />
   </children>
</AnchorPane>

И собственно котроллер

package addAnyProductForm;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXCheckBox;
import com.jfoenix.controls.JFXComboBox;
import com.jfoenix.controls.JFXTextField;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import jdk.nashorn.internal.ir.IdentNode;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class productFormController {
    @FXML
    public JFXButton exitButton;
    @FXML public JFXTextField productIdTextField;
    @FXML public JFXTextField productNameTextField;
    @FXML public JFXTextField productCountTextField;
    @FXML public JFXTextField productCostTextField;
    @FXML public JFXComboBox productComboBox;
    @FXML
    public void exitAction()
    {
        Stage stage = (Stage) exitButton.getScene().getWindow();
        stage.close();
    }
    @FXML
    public void addAction()
    {
        String sql = "";
        Connection connection = helpers.SQLiteHelper.Connect();
       if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Напитки")
        {
            sql = "INSERT INTO drinks(id,name,count,cost) VALUES (?,?,?,?)";
        }
        if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Пицца")
        {
            sql = "INSERT INTO client_pizza(id,name,count,cost) VALUES (?,?,?,?)";
        }
        if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Суши")
        {
            sql = "INSERT INTO sushi(id,name,count,cost) VALUES (?,?,?,?)";
        }
        if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Салаты")
        {
            sql = "INSERT INTO salads(id,name,count,cost) VALUES (?,?,?,?)";
        }
        try
        {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,Integer.parseInt(productIdTextField.getText()));
            preparedStatement.setString(2, productNameTextField.getText());
            preparedStatement.setInt(3,Integer.parseInt(productCountTextField.getText()));
            preparedStatement.setDouble(4,Double.parseDouble(productCostTextField.getText()));
            preparedStatement.executeUpdate();
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("Информация");
            alert.setHeaderText(null);
            alert.setContentText("Готово!");
            alert.showAndWait();
        }
        catch (SQLException exp)
        {System.out.println(exp);}
    }
}

Как вы можете видеть логическая\кодовая разница между двумя контроллерами - минимальна. Однако первая форма полностью рабочая, а вторая форма выдает неприятную ошибку вида:

java.sql.SQLException: The prepared statement has been finalized

Уважаемое сообщество, что я делаю не так? Благодарю вас!

READ ALSO
Более одного конструктора в классе [требует правки]

Более одного конструктора в классе [требует правки]

Как можно написать два конструктора для одного класса?

344
Как получить JSON из CURL запроса?

Как получить JSON из CURL запроса?

У меня имеется следующий пример CURL запроса

299
Парсинг Json, почему не работает?

Парсинг Json, почему не работает?

Что я сделал не так?

395