【问题标题】:How to insert record ID instead of Varchar to my MySql using JComboBox in JAVA Netbeans如何在 JAVA Netbeans 中使用 JComboBox 将记录 ID 而不是 Varchar 插入我的 MySql
【发布时间】:2019-06-08 18:26:43
【问题描述】:

嗨,

我想寻求有关使用 JComboBox 将条目添加到 MySql 数据库的帮助。问题是,我的数据库中有多个表,其中大多数都存在关系。

例子:

Employee_Details 表,它有 3 个外键,来自另一个表,例如 Position、Department 和 Office_Location。现在这些外键的数据类型值为 INT,现在的问题是,如果我在组合框中选择一个给定的字符值并点击保存,它会给我一个错误,因为它显然与分配的数据类型不匹配employee_details 数据库表。

问题:

如何在组合框中选择任何给定的字符值,当我单击添加或插入按钮时,它将保存该值的 ID 而不是变量字符。

private void Position(){ // Position Combo Box

     try {
         String sqlPosition = "Select * From positions";
         pst = con.prepareStatement(sqlPosition);
         rs = pst.executeQuery();

         while(rs.next()){

             JCB_Position.addItem(rs.getString("Position"));


         }

     } catch (SQLException e) {
         JOptionPane.showMessageDialog(null, e);
     }
 }

 private boolean CheckInputs(){

     if(jTextFieldFname.getText() != null || jTextFieldLname.getText() !=null || JCB_Department.getSelectedItem() != null 
             || JCB_Location.getSelectedItem() != null
             || JCB_Location.getSelectedItem() != null
             || JCB_EmpStat.getSelectedItem() !=null
             )
     {
         return true;
     }
     return false;  
 }

private void jButtonAddEmpActionPerformed(java.awt.event.ActionEvent evt) {                                              

    int InsertToDB = JOptionPane.showConfirmDialog(null, "Do you want to save this entry?", "SAVE",JOptionPane.YES_NO_OPTION);

    if (InsertToDB == 0)
    {

        String Gender = null;

        if(JRB_Male.isSelected())
        {
            Gender = "Male";
        }
        else if(JRB_Female.isSelected())
        {
            Gender = "Female";
        }

        jTextFieldFname.getText();
        jTextFieldLname.getText();
        jTextFieldOfficeNumber.getText();
        jTextFieldMobNumber.getText();
        jTextFieldEmailAdd.getText();
        jTextAreaRemarks.getText();
        String Position = JCB_Position.getSelectedItem().toString();
        //String Dept = JCB_Department.getSelectedItem().toString();
        //String Loc = JCB_Location.getSelectedItem().toString();
        //String Status = JCB_EmpStat.getSelectedItem().toString();   

        if(CheckInputs() != false)
        {
            try {
                pst = con.prepareStatement("INSERT INTO employee_details (First_Name, Last_Name, Gender, "
                        + "Office_Number, Mobile_Number, Email_Address, Remarks)"
                        + "VALUES (?,?,?,?,?,?,?)");

                pst.setString(1, jTextFieldFname.getText());
                pst.setString(2, jTextFieldLname.getText());
                pst.setString(3, Gender);
               //pst.setInt(4, Position);
                //pst.setString(5, Dept);
                //pst.setString(6, Loc);
                //pst.setString(7, Status);
                pst.setString(4, jTextFieldOfficeNumber.getText());
                pst.setString(5, jTextFieldMobNumber.getText());
                pst.setString(6, jTextFieldEmailAdd.getText());
                pst.setString(7, jTextAreaRemarks.getText());

                pst.executeUpdate();
                JOptionPane.showMessageDialog(null, "Succesfully Saved");

            } catch (SQLException ex) {
                Logger.getLogger(Employee_Details.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        else{
        JOptionPane.showMessageDialog(null, "Check the mandatory fields");
        }
    }

}                          

【问题讨论】:

  • 请显示您用值填充组合框的代码部分
  • 请检查上面附上的代码,那是添加按钮的代码。注意:我没有为任何组合框分配任何动作监听器。所有代码仅在“添加”按钮中分配。
  • 这是单击按钮时执行的代码,我需要查看您将可以选择的值放入组合框(JCB_Position)的代码。您还应该遵循java命名约定并为变量使用小写名称,大写(例如您的变量“Gender”)通常用于类名,如果这样使用可能会导致冲突
  • 那里,我重新编辑一下。我可以处理命名和约定。我只需要知道如何克服这个问题。

标签: java mysql swing jcombobox


【解决方案1】:

目前您正在将字符串添加到您的 JComboBox,因此不会保留与 id 的关联。

你可以像这样创建一个包装类:

public class PositionWrapper {
    private int id;
    private String position;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public String toString() {
        return position;
    }
}

并像这样将它添加到您的 JComboBox 中:

while(rs.next()){
    PositionWrapper position = new PositionWrapper();
    position.setId(rs.getInt("Position_ID"));
    position.setPosition(rs.getString("Position"));
    JCB_Position.addItem(position);
}

JComboBox 将使用PositionWrappertoString() 方法作为内容,但使用JCB_Position.getSelectedItem() 现在将返回PositionWrapper

现在只需从那里获取 id:

pst.setInt(0, ((PositionWrapper)JCB_Position.getSelectedItem()).getId());

如果您的 JComboBox 是可编辑的,那么您需要先检查返回对象的类型,否则您可能会收到异常。

您需要将 JComboBox 的类型调整为JComboBox<PositionWrapper>

【讨论】:

  • 我在JCB_Position.addItem(EmpPos); 收到错误错误:不兼容的类型:Employee_details.PositionWrapper 无法转换为字符串。
  • 这是我的代码,我更改了一些命名和约定。 while(rs.next()){ PositionWrapper EmpPos = new PositionWrapper(); EmpPos.setID(rs.getInt("Position_ID")); EmpPos.setPosition("Position"); JCB_Position.addItem(EmpPos);
  • 您必须像我说的那样更改 JComboBox 的类型 - 如果您使用的是 GUI 编辑器,您应该在那里进行,否则您需要更改看起来像 JComboBox JCB_Position = new JComboBox() 或其他东西的行类似。
  • pst.setInt(4, Emp_Positions.getSelectedItem().getid); getid 不起作用。这是我现在遇到的唯一错误。
  • 我需要在private void jButtonAddEmpActionPerformed(java.awt.event.ActionEvent evt)方法中调用PotsitionWrapper类吗?
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多