-1

我有以下 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 是书籍表中的外键。

4

2 回答 2

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使用作者姓名填充时,请使用此类而不是 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());

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

pst = con.prepareStatement(sql);
pst.setInt(1, ((OneAuthor)author_name_combo.getSelectedItem()).getKey());
pst.setString(2, book_name.getText());
于 2012-10-07T13:06:33.530 回答
0

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

于 2012-10-07T12:53:44.227 回答