从ComboBOX值更新AuthorID

时间:2012-10-07 12:49:34

标签: java sql database swing jcombobox

我有以下sql表:

作者:

Id           Name

2         John Smith

书籍:

Id        AuthorID       Title
 1           2          Shreak

我正在尝试通过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);
    }
}

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

2 个答案:

答案 0 :(得分:2)

假设您正在使用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时,请使用此类而不是字符串:

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());

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

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

答案 1 :(得分:0)

如果您的AuthorID在数据库中的类型为INTEGER,则问题是您在此语句String

中为其插入pst.setString(1, author_name_combo.getName());