java应用程序无法将空值插入mysql数据库

标签 java mysql swing textbox

我正在使用 Netbeans 制作一个 java 程序,我想将数据插入到我的“data supplier”表中。我无法发布我的 JFrame 图片,因为我的声誉不够。

我已将 "Kode Supplier"设置为 PRIMARY_KEYNOT_NULL,并允许其余部分为 NULL

在下面的代码中,如果我没有在文本框中输入任何内容,telpFieldhpField 将显示错误

有没有可能因为是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 SupplierNoTelpNoHP 列是整数列。对于整数列,您应该使用 setInt 方法而不是 setString

但是 setInt 方法只接受原始 int 作为字段的值。因此,您需要做的第一件事是将字段的 String 值转换为 int。这是通过如下语句完成的:

int telpVal = Integer.parseInt(telpField.getText());

但这意味着您必须决定在以下情况下要做什么:

  • 用户在 GUI 字段中输入了一个非整数值,例如 ABC1.2123456789123456789。如果发生这种情况,那么我给出的语句将抛出一个 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 的方式不同于NoTelpNoHP,因为它不允许为空。如果该字段为空,NumberFormatException 将从 parseInt 中抛出并转到 catch 部分。
  • 我保留了一个 fieldName 变量,该变量是我在尝试每个 parseInt 之前设置的。如果抛出异常,我们可以用它来在对话框中显示发生错误的具体字段。您可以做其他事情,例如保留当前正在处理的 JTextField,并在 catch 中突出显示它并赋予它焦点。
  • 当您使用 setNull 时,您必须将字段类型作为第二个参数传递。所有类型都在 java.sql.Types 中。所以记得import java.sql.Types
  • 不要使用catch (Exception e)。它太宽泛了。在这种情况下,我们只需要 NumberFormatExceptionSQLException。如果发生任何其他异常,尤其是运行时异常,您想了解它并查看堆栈跟踪。如果您有 catch (Exception e),您只会看到一个对话框,上面写着“数据无效”,这没有帮助。 “一网打尽”不好。

关于java应用程序无法将空值插入mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796925/

相关文章:

java - Glassfish v2 alterdocroot - DAS 会同步吗?

php - 如何使用 PHP 创建自定义 CSV 文件?

php - 删除数据库中存在的数组值?

php - MYSQL 表和列命名约定

java - 从网站复制到 JTextPane 会给我不需要的格式和 html 标签

java - 将过滤器重新应用到过滤后的 JTable View

java - 用于检测 "[blablablabla]"等内容的正则表达式

java - 如何省略将 '\n'(换行符)添加到从文件读取的字符数组中

java - JavaFx Gui 与 Swing 的性能对比

java - for while if 循环嵌套错误消息,如果没有找到