我有以下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是书籍表中的外键。
答案 0 :(得分:2)
假设您正在使用Swing(即JComboBox
和JTextField
)。
您没有正确地将值分配给?
变量。首先,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());
值