我正在使用 Netbeans
制作一个 java 程序,我想将数据插入到我的“data supplier
”表中。我无法发布我的 JFrame
图片,因为我的声誉不够。
我已将 "Kode Supplier
"设置为 PRIMARY_KEY
和 NOT_NULL
,并允许其余部分为 NULL
在下面的代码中,如果我没有在文本框中输入任何内容,telpField
和 hpField
将显示错误
有没有可能因为是INT
类型?
这是我的代码:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try{
String sql = "INSERT INTO datasupplier (`Kode Supplier`, `Nama Supplier`, `Contact Person`,"
+ " `Alamat`, `NoTelp`, `NoHP`, `Bank Account`, `A/C Info`, `A.N.`, `Keterangan`)"
+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
pst = conn.prepareStatement(sql);
//Get value from the textboxes
pst.setString(1, codeField.getText());
pst.setString(2, nameField.getText());
pst.setString(3, cpField.getText());
pst.setString(4, addressField.getText());
pst.setString(5, telpField.getText());
pst.setString(6, hpField.getText());
pst.setString(7, bankField.getText());
pst.setString(8, acField.getText());
pst.setString(9,anField.getText());
pst.setString(10, ketField.getText());
pst.execute();
JOptionPane.showMessageDialog(null, "Tabel Telah Di Update");
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "Data Invalid");
}
DataSupplierTable();
}
//Set JComboBox First Diplayed Item
private void setTableCombo(){
tableCombo.setSelectedItem("Data Supplier");
}
//Bind the table and databarang.datasupplier
private void DataSupplierTable(){
String sql = "SELECT * FROM datasupplier";
try{
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
supplierTable.setModel(DbUtils.resultSetToTableModel(rs));
supplierTable.isCellEditable(0,0);
}catch(Exception e){
}
}
这是我的表(使用 MySQL 社区服务器数据库,InnoDB)
Kode Supplier INT(30) PRIMARY_KEY NOT_NULL, Nama Supplier CHAR(45), Contact Person VARCHAR(20), Alamat VARCHAR(45), NoTelp INT(30), NoHP INT(30), Bank Account CHAR(30), A/C Info VARCHAR(45), A.N. CHAR(45), Keterangan VARCHAR(100)
最佳答案
是的,这是因为您的 Kode Supplier
、NoTelp
和 NoHP
列是整数列。对于整数列,您应该使用 setInt
方法而不是 setString
。
但是 setInt
方法只接受原始 int
作为字段的值。因此,您需要做的第一件事是将字段的 String
值转换为 int
。这是通过如下语句完成的:
int telpVal = Integer.parseInt(telpField.getText());
但这意味着您必须决定在以下情况下要做什么:
用户在 GUI 字段中输入了一个非整数值,例如
ABC
、1.2
或123456789123456789
。如果发生这种情况,那么我给出的语句将抛出一个NumberFormatException
。发生这种情况时,您可以决定显示一条错误消息而不调用插入语句。或者您可能决定插入一个
NULL
。或者您可能决定插入一个默认值,例如0
。用户在 GUI 字段中未输入任何值 - 它是一个空字符串。请注意,空字符串和
null
之间存在差异。您可以决定像处理前一个案例一样处理这个案例。或者您可以决定单独处理。
假设您决定:
- 如果用户输入了非法数字,您将显示一条错误消息并且不会插入该行。
- 如果用户没有输入值并将该字段留空,您需要插入一个空值。
然后你需要这样处理:
String fieldName;
try {
String sql = "INSERT INTO datasupplier (`Kode Supplier`, `Nama Supplier`, `Contact Person`,"
+ " `Alamat`, `NoTelp`, `NoHP`, `Bank Account`, `A/C Info`, `A.N.`, `Keterangan`)"
+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
pst = conn.prepareStatement(sql);
//Get value from the textboxes
// Kode supplier is integer, but is not allowed to be null
// so don't handle an empty field case, just let parseInt
// throw the exception.
fieldName = "Kode Supplier";
pst.setInt(1, Integer.parseInt(codeField.getText()));
pst.setString(2, nameField.getText());
pst.setString(3, cpField.getText());
pst.setString(4, addressField.getText());
// Handle the NoTelp field - if empty, insert null. If not,
// parse the number. Handle illegal number values in catch.
fieldName = "NoTelp";
if ( telpField.getText().isEmpty() ) {
pst.setNull(5, Types.INTEGER);
} else {
pst.setInt(5, Integer.parseInt(telpField.getText());
}
// Handle the NoHP field
fieldName = "NoHP";
if ( hpField.getText().isEmpty() ) {
pst.setNull(6, Types.INTEGER);
} else {
pst.setInt(6, Integer.parseInt(hpField.getText());
}
pst.setString(7, bankField.getText());
pst.setString(8, acField.getText());
pst.setString(9,anField.getText());
pst.setString(10, ketField.getText());
pst.executeUpdate();
JOptionPane.showMessageDialog(null, "Tabel Telah Di Update");
}
catch (NumberFormatException nfe) {
// Display error to the user
JOptionPane.showMessageDialog(null, "Invalid number in field " + fieldName)
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, "Data Invalid");
}
注意事项
- 我处理
Kode Supplier
的方式不同于NoTelp
和NoHP
,因为它不允许为空。如果该字段为空,NumberFormatException
将从parseInt
中抛出并转到catch
部分。 - 我保留了一个
fieldName
变量,该变量是我在尝试每个parseInt
之前设置的。如果抛出异常,我们可以用它来在对话框中显示发生错误的具体字段。您可以做其他事情,例如保留当前正在处理的JTextField
,并在catch
中突出显示它并赋予它焦点。 - 当您使用
setNull
时,您必须将字段类型作为第二个参数传递。所有类型都在java.sql.Types
中。所以记得import java.sql.Types
。 - 不要使用
catch (Exception e)
。它太宽泛了。在这种情况下,我们只需要NumberFormatException
和SQLException
。如果发生任何其他异常,尤其是运行时异常,您想了解它并查看堆栈跟踪。如果您有catch (Exception e)
,您只会看到一个对话框,上面写着“数据无效”,这没有帮助。 “一网打尽”不好。
关于java应用程序无法将空值插入mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796925/