-1

次の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);
    }
}

私は初心者で、テーブルに新しいデータを入力するのに苦労しています。プログラムはコンパイルされますが、books テーブルの AUTHOR ID と TITLE の両方に NULL が表示されます。作成者 ID が Authors テーブルから自動的に検索され、そこから適切な ID 番号が与えられるように、テーブルを正しく設定するにはどうすればよいですか。著者 ID は books テーブルの外部キーであることに注意してください。

4

2 に答える 2

2

あなたが Swing で作業していると仮定します (すなわちJComboBoxJTextField)。

?変数に値を正しく割り当てていません。まず、AuthorIDは整数であり、選択したテキストではなく、作成者の ID を割り当てる必要があります。

toString()これを回避する 1 つの方法は、対応するメソッドを使用して、作成者の ID と名前を保持する独自の単純なクラスを作成することです。

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挿入していることですStringpst.setString(1, author_name_combo.getName());

于 2012-10-07T12:53:44.227 に答える