2016-05-25 1 views
0

このメソッドは正常に動作していないと思われることを除いてはうまく動作します。私は2つのテーブルを持っています同じtry-with-resourcesブロック内で2つのprepared statementを使用してもかまいません。

一つの科目は多く学年です。

一つの学年は多く被験者

件名を

code PK 
creator 
dateCreated 
description 
name 
units 
yearLevel 

SchoolYearSubjectsている(対象は多くを持つことができるか、異なる学年に所属することができます)

id PK 
code FK 
dateAdded 
schoolyear 

ここにその方法があります。

public Boolean add(){ 
     Boolean success ; 
     String SQLa = "INSERT INTO subject(name,code,units,description,yearlevel,creator) " 
       + "VALUES (?,?,?,?,?,?)"; 
     String SQLb = "INSERT INTO schoolyearsubjects(code,schoolyear,addedBy) values(?,?,?)"; 
     try(Connection con = DBUtil.getConnection(DBType.MYSQL); 
       PreparedStatement ps1 = con.prepareStatement(SQLa); 
       PreparedStatement ps2= con.prepareStatement(SQLb);){ 
      //a.)Prepare ps1 
      ps1.setString(1,subjectName); 
      ps1.setString(2,subjectCode); 
      ps1.setInt(3, subjectUnits); 
      ps1.setString(4, subjectDescription); 
      ps1.setString(5, subjectYearLevel); 
      ps1.setString(6, Login.getUsername()); 

      //b.)Prepare ps2 
      ps2.setString(1,subjectCode); 
      ps2.setString(2, schoolYearStart+"-"+schoolYearEnd); 
      ps2.setString(3, Login.getUsername()); 

      //c.) execute both statements 
      ps1.executeUpdate(); 
      ps2.executeUpdate(); 

      success = true; 

     } catch (SQLException e) { 
      success = false; 
      JOptionPane.showMessageDialog(null,e.getClass()+" "+e.getMessage()); 
     } 
     return success; 
    } 

私は、1つの方法の中に2つの準備された声明を持つことに固執することに躊躇しています。

code列がForeign Keyであり、両方が同じ関数内で実行されなければならないことを考慮して、BOTH文の実行を確実にするにはどうすればよいですか? また、追加するには、add()メソッドは1つのボタンに限定されています。

私が間違っていることがあれば、私に助言してください。

ありがとうございました。

+0

別々に障害を処理する以外の理由がない場合は、INSERT文を分割することを検討してくださいあなたの呼び出しコードで。現在のところ、単一のブール値がこれを伝えることができないため、あるエラーと別のエラーを区別するためにエラーコードを使用する必要があります。 –

+0

2つのpreparedStatementの実行に間違いはありませんが、作成した 'PreparedStatement'と' Connection'オブジェクトを閉じることを忘れないでください。そうしないと、sqlErrorが発生します。 – viveksinghggits

答えて

-1

2つのプリペアドステートメントが1つのブロックに間違っていることはありません。そのあなたの」

 con.setAutoCommit(false); // switch to transactional mode 
    ... 
    ps1.executeUpdate(); 
    ps2.executeUpdate(); 

    con.commit();    // commit the transaction 
} 
catch(...) { 
    con.rollback();   // undo everything that happened 
} 

注:

複数の保証の実行では、SQLの「取引」と呼んでいるものであり、Javaで、あなたはそれを次のように(あなたのtryブロック内で開始)を行うことができますtry-with-resourcesの外側に接続オブジェクトを移動して、キャッチブロック内のアクセス権を持っている必要があります。 (接続が "寿命の長い" "高価な"オブジェクトなので、通常はどちらにしても大丈夫です)

関連する問題