【问题标题】:Updating AuthorID From ComboBOX value从 ComboBOX 值更新 AuthorID
【发布时间】:2012-10-07 12:49:33
【问题描述】:

我有以下 sql 表:

作者:

Id           Name

2         John Smith

书籍:

Id        AuthorID       Title
 1           2          Shreak

我正在尝试通过 GUI 将更多书籍添加到书籍表中,该 GUI 有一个下拉框来显示作者表中的作者,以及一个用于输入新书的文本框和一个保存按钮。以下是对应保存按钮的:

pprivate void save_bookActionPerformed(java.awt.event.ActionEvent evt) {

    try {



        String sql = "INSERT into books (AuthorId,Title) VALUES (?,?)";
        pst = con.prepareStatement(sql);
       pst.setInt(1, author_name_combo.getSelectedItem());
        pst.setString(2, book_name.getText());


        pst.executeUpdate();
        JOptionPane.showMessageDialog(null, "New Book has been added");
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }

}



private void FillCombo(){ 

    try {

    con = DriverManager.getConnection(url, user, password);
    String sql = "SELECT * FROM Authors";
     pst = con.prepareStatement(sql);
     rs = pst.executeQuery();
     while(rs.next()) {
         String author = rs.getString("Name");
         author_name_combo.addItem(author);  
     }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
}

我是一个初学者,我正在努力用新数据填充表格。程序编译但书籍表显示 NULL 为 AUTHOR ID 和 TITLE。如何正确填充表,以便自动从 Authors 表中查找作者 ID 并从那里给出适当的 ID 号。请注意作者 ID 是书籍表中的外键。

【问题讨论】:

  • 考虑使用调试器或在代码中添加System.out.println(someVariableThatYouWantToTestHere),看看哪些地方不能正常工作。
  • 问题最终出在数据类型不兼容上。请向我们展示您的表格定义。还要获取 JCombobox 的值,请使用 getSelectedItem()
  • getSelectedItem() 与 setInt 不兼容
  • 请看上面的编辑代码,用什么代替 getNAME() 来正确更新作者 ID
  • @OuldAbba 是正确的。 getSelectedItem() 将获得 JComboBox 模型持有的选定对象。然后,您将调用该对象必须的任何方法来获取作者 ID int。

标签: java sql database swing jcombobox


【解决方案1】:

假设您正在使用 Swing(即 JComboBoxJTextField)。

您没有正确地将值分配给? 变量。首先AuthorID是一个整数,你需要分配作者的ID,而不是选择的文本。

绕过它的一种方法是创建自己的简单类来保存作者的 ID 和姓名,并使用相应的 toString() 方法:

class OneAuthor extends AbstractMap.SimpleEntry<Integer, String> {
    public OneAuthor(Integer id, String name) {
        super(id, name);
    }

    public String toString() {
        return getValue();
    }
}

然后,当您使用作者姓名填充 JComboBox 时,请使用此类而不是 String:

ResultSet rs = con.createStatement().executeQuery("SELECT id, name FROM authors ORDER BY name");

while(rs.next()) {
    author_names_combo.addItem(new OneAuthor(rs.getInt(1), rs.getString(2));
}

然后您可以轻松指定正确的作者 ID:

pst.setInt(1, ((OneAuthor)author_name_combo.getSelectedItem()).getKey());

其次,您需要在书名文本字段上使用getText()方法,而不是使用getSelectedText()getSelectedText() 将仅返回字段中突出显示的文本,而 getText() 将返回整个文本。因此,您的完整代码将是这样的:

pst = con.prepareStatement(sql);
pst.setInt(1, ((OneAuthor)author_name_combo.getSelectedItem()).getKey());
pst.setString(2, book_name.getText());

【讨论】:

  • 从他的问题标签看来,他实际上是在使用 Swing 而不是 AWT。您可能希望编辑此答案以符合此要求。
  • 我用的是Java Swing,方法好像很复杂
  • @MuminAli 给我几分钟,我会更新挥杆的答案。至于“复杂”,嗯,这是完成工作的方式。不过挥杆会有所不同。
  • 谢谢,不使用抽象地图就没有办法找到解决方案。我需要限制类的使用
  • 组合框项目的 getSelectedIndex() 和添加 1 会导致问题吗?它确实正确填充表格
【解决方案2】:

如果您的AuthorID 在您的数据库中属于INTEGER 类型,那么问题是您在此语句pst.setString(1, author_name_combo.getName()); 中为其插入String

【讨论】:

  • 是的,我的 authorid 实际上是 INTEGER。我将 setstring 替换为 setInt,但 getName() 会用什么代替?
  • 我想要与作者表中相同的作者 ID,即主键
  • 那么首先你需要从你的Author 表中为那个特定的Name 获取AuthorID,然后使用你得到的AuthodID
  • @Abu 您需要小心这一点,因为(理论上)不止一位作者具有相同的姓名但不同的 ID。
  • @Aleks 是的,我也这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多