Java 相同类型的代码,但有一个代码显示异常
我编辑了这个问题。这是完整的代码。看一看Java 相同类型的代码,但有一个代码显示异常,java,mysql,exception,Java,Mysql,Exception,我编辑了这个问题。这是完整的代码。看一看 public class AddStaff extends Application { private Connection connect = null; private Statement statement = null; private ResultSet rs = null; private PreparedStatement preparedStatement = null; TextField
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) {
}
}
}
我不知道为什么会发生这种异常。我花了很长时间来纠正它。我怎样才能避免这种例外
我以前问过这个问题。也请注意-我不认为这是您的代码,但您正在尝试向数据库插入一个具有相同主键的条目
Duplicate entry '' for key 'PRIMARY'
这意味着您要插入的项的密钥为null,并且您已经插入了具有此密钥的项
问题可能是您正在创建该表,但上一次运行时该表已经存在。创建新表时,始终尝试先删除。代码中没有问题,但在数据库中插入的值违反了主键约束
Duplicate entry '' for key 'PRIMARY'
明确说明您正试图在主字段staffname中输入重复的empaty字符串
stuffname是字段,它是主键。我假设变量msg是一个空字符串,并且您已尝试运行代码两次
异常表示,您正在尝试插入表中已存在的主键值
preparedStatement.setString(1, msg);
您试图插入的msg为null,可能是因为异常显示staff表中存在重复条目,并且列staffname具有主键约束,所以它不允许您插入重复值
编辑:
编辑后出现异常的原因相同。
但是,您可以改进代码设计
将msg作为enterstaff方法的参数
并在调用方法之前检查msg是否不为null
if ( null != msg && !msg.trim().equals(""))
{
enterstaff(msg);
}
我解决了。我刚把职员的名字改成了用户。现在没有例外,一切正常。1。从信息模式中选择计数*以从信息模式中选择计数*。2.staffname是主键,因此请确保您没有为其添加重复的值。您可以通过调试代码轻松找到错误…似乎msg没有使用正确的输入填充。请再次查看异常。它说我不止一次尝试进入“”。但我没有尝试过进入''。我总是在文本字段中键入一些数据。文本字段中的数据如何没有被输入到数据库中。@Tom:可能是因为从上一次运行开始,表就在那里,您没有将它与之前插入的项一起删除。@Tom:当您调试行preparedStatement.SetString,msg;它是空的吗?您可以使用System.out.printlnmg打印出来;看看。我们可以把问题分为与数据库相关还是与输入相关。请再次查看异常。它说我不止一次尝试进入“”。但我没有尝试过进入''。我总是在文本字段中键入一些数据。了解如何将文本字段中的数据输入数据库。调试消息字段。这可能是主要的问题
enterStaff(addSubName.getText());
public void enterStaff(String stuffName){
if(stuffName!=null && !stuffName.trim().isEmpty()){
...
}
}
Duplicate entry '' for key 'PRIMARY'
preparedStatement.setString(1, msg);
enterstaff(String msg)...
if ( null != msg && !msg.trim().equals(""))
{
enterstaff(msg);
}