0

学生から料金を受け取り、受け取った金額、受け取った合計金額、支払い方法などの記録を維持するデータベースのテーブルを更新しようとしています。私のコードは次のとおりです。

private void pay_saveActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String dbUrl = "jdbc:mysql://localhost/hostel";
    String dbClass = "com.mysql.jdbc.Driver";
    PreparedStatement ps1 = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");

            con = DriverManager.getConnection (dbUrl,"root","17121990");
            System.out.println("connected!");

            String firstname=pay_enter_firstname.getText();
            String lastname=pay_enter_lastname.getText();

            String amt=pay_enter_amt.getText();
            int amount=Integer.parseInt(amt);
            String day=pay_enter_date.getText(); 
            String cheque_no=pay_enter_chequeno.getText();
            String mode=pay_enter_mode.getText();
            int totalamount=10000;               
            int bal_amt=totalamount-amount;
            String remark=pay_enter_remark.getText();          
            int id = Integer.parseInt(pay_enter_id.getText());

            Statement stmt = con.createStatement(
                                  ResultSet.TYPE_SCROLL_INSENSITIVE,
                                  ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment");





            if(rs.next())
           {
                stmt = con.createStatement(
                                  ResultSet.TYPE_SCROLL_INSENSITIVE,
                                  ResultSet.CONCUR_UPDATABLE);
                rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment");

              while(rs.next())
                {



              int temp =rs.getInt(1);

              if (temp ==id)
              {
                  int amtrecvd2= rs.getInt(2);
                  bal_amt=totalamount- (amtrecvd2+amount);
                  String updt = "UPDATE payment SET Amountreceivd="+(amtrecvd2+amount)+",lastamtreceived="+amount+",dte='"+day+"', balance_amt ="+bal_amt+" WHERE id ="+temp+";" ;
                  Statement stmt1 = con.createStatement();
                  int result = stmt1.executeUpdate(updt);
              }

                }
           }

             if(!rs.next())
            {
                String str=" INSERT INTO payment(id, firstname,lastname,Amountreceivd,dte,lastamtreceived,Creditcashcheque,"
                   + "cheque_no,balance_amt,totalamount,Remark) VALUES ("+id+",'"+firstname+"','"+lastname+"',"+amount+",'"+day+"',"+amount+",'"+mode+"','"+cheque_no+"',"+ bal_amt+","+totalamount+",'"+remark+"')";
                Statement stmt1=con.createStatement();

                int result=stmt1.executeUpdate(str);
                panel_feesframe.setVisible(false);
            }


               panel_feesframe.setVisible(false);



    con.close();
    }
        catch (ClassNotFoundException | SQLException | NumberFormatException e)
    {
        e.printStackTrace();
    }

}

最初に新しい値を追加すると正しく取得されますが、既存の行を更新しようとすると、主キー ID のエントリが重複しているというエラーが表示されます。

結果セットに特定のID値がなく、新しい人が料金を支払っていることを知るには、どの条件を確認すればよいですか??

4

3 に答える 3

1

あなたは2つのifステートメントが衝突しています...

// If this is true...
if(rs.next()) {
    // ...
    // Looping till the it's false...
    while(rs.next()) {
        // ....
    }
 }

 // Will mean that this is false...
 if(!rs.next())

を使用する必要がありますelse

if(rs.next()) {
    // ...
    while(rs.next()) {
        // ....
    }
 } else {...}

更新しました

Aashray による啓発的な変換 (ありがとう) の後、あなたのロジックは壊れていると結論付けました

手動で ID を照合して手動でレコードを見つけようとするのではなく、SQL データベースに任せます。

それ以外の....

ResultSet rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment");

あなたが使用している必要があります...

ResultSet rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment where id = " + id);

ResultSetこれは、空 (一致なし) または (できれば) 1 行の a を返します。

そこから呼び出すrs.next()と、更新または挿入の間で正しく分岐できるようになりました。

private void pay_saveActionPerformed(java.awt.event.ActionEvent evt) {
    String dbUrl = "jdbc:mysql://localhost/hostel";
    String dbClass = "com.mysql.jdbc.Driver";
    PreparedStatement ps1 = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");

        con = DriverManager.getConnection(dbUrl, "root", "17121990");
        System.out.println("connected!");

        String firstname = pay_enter_firstname.getText();
        String lastname = pay_enter_lastname.getText();

        String amt = pay_enter_amt.getText();
        int amount = Integer.parseInt(amt);
        String day = pay_enter_date.getText();
        String cheque_no = pay_enter_chequeno.getText();
        String mode = pay_enter_mode.getText();
        int totalamount = 10000;
        int bal_amt = totalamount - amount;
        String remark = pay_enter_remark.getText();
        int id = Integer.parseInt(pay_enter_id.getText());

        Statement stmt = con.createStatement(
                        ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment where id = " + id);

        if (rs.next()) {
            int amtrecvd2 = rs.getInt(2);
            bal_amt = totalamount - (amtrecvd2 + amount);
            String updt = "UPDATE payment SET Amountreceivd=" + (amtrecvd2 + amount) + ",lastamtreceived=" + amount + ",dte='" + day + "', balance_amt =" + bal_amt + " WHERE id =" + id + ";";
            Statement stmt1 = con.createStatement();
            int result = stmt1.executeUpdate(updt);
        } else {
            String str = " INSERT INTO payment(id, firstname,lastname,Amountreceivd,dte,lastamtreceived,Creditcashcheque,"
                            + "cheque_no,balance_amt,totalamount,Remark) VALUES (" + id + ",'" + firstname + "','" + lastname + "'," + amount + ",'" + day + "'," + amount + ",'" + mode + "','" + cheque_no + "'," + bal_amt + "," + totalamount + ",'" + remark + "')";
            Statement stmt1 = con.createStatement();

            int result = stmt1.executeUpdate(str);
            panel_feesframe.setVisible(false);
        }

        panel_feesframe.setVisible(false);

        con.close();
    } catch (ClassNotFoundException | SQLException | NumberFormatException e) {
        e.printStackTrace();
    }

}
于 2013-02-27T09:00:21.803 に答える
1

この条件: if(!rs.next()) while ループの外でチェックされています。この条件は常に真であり、更新が行われた場合でもレコードを挿入しようとします。これを回避するには、フラグ変数を使用することをお勧めします。更新が発生したら、このフラグの値を 1 に設定します。代わりに 1 になっていることを確認して、if(!rs.next())中に入ります。

于 2013-02-27T08:58:10.790 に答える
0
    I think this may help you

private void pay_saveActionPerformed(java.awt.event.ActionEvent evt) {
String dbUrl = "jdbc:mysql://localhost/hostel"; 文字列 dbClass = "com.mysql.jdbc.Driver"; PreparedStatement ps1 = null;

{ Class.forName("com.mysql.jdbc.Driver"); を試してください。

    con = DriverManager.getConnection (dbUrl,"root","17121990");
    System.out.println("connected!");

    String firstname=pay_enter_firstname.getText();
    String lastname=pay_enter_lastname.getText();

    String amt=pay_enter_amt.getText();
    int amount=Integer.parseInt(amt);
    String day=pay_enter_date.getText(); 
    String cheque_no=pay_enter_chequeno.getText();
    String mode=pay_enter_mode.getText();
    int totalamount=10000;               
    int bal_amt=totalamount-amount;
    String remark=pay_enter_remark.getText();          
    int id = Integer.parseInt(pay_enter_id.getText());

    Statement stmt = con.createStatement(
                          ResultSet.TYPE_SCROLL_INSENSITIVE,
                          ResultSet.CONCUR_UPDATABLE);
    ResultSet rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment");





    if(rs.next())
   {
        stmt = con.createStatement(
                          ResultSet.TYPE_SCROLL_INSENSITIVE,
                          ResultSet.CONCUR_UPDATABLE);
        rs = stmt.executeQuery("SELECT id, lastamtreceived FROM payment");

      while(rs.next())
        {



      int temp =rs.getInt(1);

      if (temp ==id)
      {
          int amtrecvd2= rs.getInt(2);
          bal_amt=totalamount- (amtrecvd2+amount);
          String updt = "UPDATE payment SET Amountreceivd="+(amtrecvd2+amount)+",lastamtreceived="+amount+",dte='"+day+"', balance_amt ="+bal_amt+" WHERE id ="+temp+";" ;
          Statement stmt1 = con.createStatement();
          int result = stmt1.executeUpdate(updt);
      }

        }
   }
    else
    {
        String str=" INSERT INTO payment(id, firstname,lastname,Amountreceivd,dte,lastamtreceived,Creditcashcheque,"
           + "cheque_no,balance_amt,totalamount,Remark) VALUES ("+id+",'"+firstname+"','"+lastname+"',"+amount+",'"+day+"',"+amount+",'"+mode+"','"+cheque_no+"',"+ bal_amt+","+totalamount+",'"+remark+"')";
        Statement stmt1=con.createStatement();

        int result=stmt1.executeUpdate(str);
        panel_feesframe.setVisible(false);
    }


       panel_feesframe.setVisible(false);

con.close(); } catch (ClassNotFoundException | SQLException | NumberFormatException e) { e.printStackTrace(); }

于 2013-02-27T09:06:44.987 に答える