【问题标题】:Same type of codes, but one code shows exception相同类型的代码,但一个代码显示异常
【发布时间】:2014-05-20 21:58:36
【问题描述】:

我编辑了问题。这是完整的代码。看看吧。

  public class AddStaff extends Application {

    private Connection connect = null;
    private Statement statement = null;
    private ResultSet rs = null;
    private PreparedStatement preparedStatement = null;
    TextField addSubName;
    String msg;
    private TableView<Staff> table = new TableView<Staff>();
    private final ObservableList<Staff> data
            = FXCollections.observableArrayList();
    final HBox hb = new HBox();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Add Staff");
        stage.setWidth(450);
        stage.setHeight(550);
        stage.setResizable(false);
        final Label label = new Label("Staff Details");
        label.setFont(Font.font("Calibri", FontWeight.BOLD, 22));
        label.setTextFill(Color.WHITE);
        TableColumn sub = new TableColumn("Staff Name");
        sub.setMinWidth(400);
        sub.setCellValueFactory(
                new PropertyValueFactory<Staff, String>("subName"));
        sub.setCellFactory(TextFieldTableCell.forTableColumn());
        sub.setOnEditCommit(
                new EventHandler<TableColumn.CellEditEvent<Staff, String>>() {
                    @Override
                    public void handle(TableColumn.CellEditEvent<Staff, String> t) {
                        ((Staff) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())).setSubName(t.getNewValue());
                    }
                }
        );

        table.setItems(data);
        table.getColumns().addAll(sub);
        addSubName = new TextField();
        addSubName.setPromptText("Staff Name");
        addSubName.setPrefSize(200, 30);    
        final Button b2 = new Button("Add");
        b2.setFont(Font.font("Calibri", FontWeight.BOLD, 17));
        b2.setPrefSize(70, 30);
        b2.setStyle(" -fx-base: #0066ff;");
        b2.setTextFill(Color.BLACK);
        b2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {

                msg = addSubName.getText();
                try {
                    enterStaff();
                } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(AddStaff.class.getName()).log(Level.SEVERE, null, ex);
                }
                data.add(new Staff(addSubName.getText()));
                addSubName.clear();
            }
        });

        hb.getChildren().addAll(addSubName, b2);
        hb.setSpacing(5);
        final VBox vbox = new VBox();
        vbox.setSpacing(10);
        vbox.setPadding(new Insets(20, 20, 20, 20));
        vbox.getChildren().addAll(label, table, hb);
        vbox.setStyle("-fx-background-color: #333333;");
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        stage.setScene(scene);
        stage.show();
    }

    public void enterStaff() throws ClassNotFoundException, SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connect = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/project?"
                            + "user=root&password=virus");
            statement = connect.createStatement();

            preparedStatement = connect
                    .prepareStatement("SELECT count(*)FROM information_schema.tables\n"
                            + "WHERE table_schema = 'project' AND table_name = 'staff'");
            rs = preparedStatement.executeQuery();
            rs.next();
            int chk = rs.getInt(1);

            if (chk != 1) {
                preparedStatement = connect
                        .prepareStatement("create table staff (staffname varchar(30) primary key");
                preparedStatement.executeUpdate();
            }

            preparedStatement = connect
                    .prepareStatement("insert into staff values(?)");
            preparedStatement.setString(1, msg);
            preparedStatement.executeUpdate();
        } catch (ClassNotFoundException | SQLException e) {
            throw e;
        } finally {
            close2();
        }

    }

    private void close2() {
        try {

            if (statement != null) {
                statement.close();
            }

            if (connect != null) {
                connect.close();
            }
        } catch (SQLException e) {

        }
    }
}

此代码正在产生异常 -

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '' for key 'PRIMARY'

我不知道为什么会出现这个异常。我尝试了很长时间来纠正它。我怎样才能避免这种异常?

我以前问过这个。也看那个-com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '' for key 'PRIMARY'

【问题讨论】:

  • 1. SELECT count(*)FROM information_schemaSELECT count(*) FROM information_schema。 2. staffname 是主键,所以请确保不要为其添加重复值。
  • 您可以通过调试代码轻松找到错误...似乎 msg 没有填充正确的输入。

标签: java mysql exception


【解决方案1】:

我解决了。我只是将名称从员工更改为用户。现在没有例外,一切正常。

【讨论】:

    【解决方案2】:
    Duplicate entry '' for key 'PRIMARY'
    

    异常说,您正在尝试插入表中已经存在的主键值。

    preparedStatement.setString(1, msg);
    

    您正在尝试插入msg,即null,可能是因为异常在staff 表中显示Duplicate entry '',该表已经存在并且您的列staffname 具有主键约束,因此它不允许插入重复值。


    编辑

    编辑后的例外原因相同。 但是,您可以改进您的代码设计。

    给 msg 作为enterstaff 方法的参数

    enterstaff(String msg)...
    

    在调用方法之前检查msg是否不是null

    if ( null != msg && !msg.trim().equals(""))
    {
       enterstaff(msg);
    }
    

    【讨论】:

      【解决方案3】:
      Duplicate entry '' for key 'PRIMARY'
      

      明确指出您正在尝试在主字段staffname 中输入重复的 empaty 字符串。

      create table staff (staffname varchar(30) primary key
      

      stuffname 是字段是主键。我假设变量 msg 是一个空字符串,并且您已尝试运行您的代码两次。


      enterStaff(addSubName.getText());
      

      ...

      public void enterStaff(String stuffName){
         if(stuffName!=null && !stuffName.trim().isEmpty()){
            ...
         }
      }
      

      【讨论】:

      • 再次查看异常。它说我试图输入“ ”不止一次。但我没有尝试输入''任何时候。我总是在文本字段中输入一些数据。一些文本字段中的数据没有输入数据库的方式。
      • 调试msg 字段。可能是主要问题
      【解决方案4】:

      代码没有问题,但是您在违反主键约束的数据库中插入值。

      【讨论】:

        【解决方案5】:

        我认为这不是您的代码,但您正尝试向数据库插入具有相同主键的条目。

        Duplicate entry '' for key 'PRIMARY'
        

        这意味着您要插入的项目有 '' (null) 作为 pirmary 键,并且您已经使用此键插入了一个项目。

        问题可能是您正在创建表,但它在上一次运行时已经存在。当你创建一个新表时,总是先尝试DROP

        【讨论】:

        • 再次查看异常。它说我试图输入“ ”不止一次。但我没有尝试输入''任何时候。我总是在文本字段中输入一些数据。一些文本字段中的数据没有进入数据库的方式。
        • @Tom:可能是上一次运行的表存在(你没有删除它)和之前插入的项目。
        • @Tom:当您在“preparedStatement.setString(1, msg);”行调试 msg 变量值时它是空的吗? (您可以使用 System.out.println(msg); 将其打印出来查看)。我们可以在这里拆分问题(是与数据库相关还是与输入相关)。
        猜你喜欢
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 2017-09-13
        相关资源
        最近更新 更多