【解決方法】取得エラー "statement.executeupdate() は、結果セットを生成するステートメントを発行できません。" JDBC を使用して mysql に挿入しようとすると

プログラミングQA


あるテーブルからプライマリ自動インクリメント キーを取得し、これを MySQL コネクタと JDBC を使用して別のテーブルに保存しようとしています。 それは私にこのエラーを与えていますが –

「statement.executeupdate() は、結果セットを生成するステートメントを発行できません。」

整数変数の格納に関係していると思いますが、よくわかりません。

public void  insertIntoWorkoutLogs(String field_setNumber, String field_repNumber, String field_weightAmount) {
              try{
                      Class.forName("com.mysql.cj.jdbc.Driver");
                      Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/workout","root","");
                      Statement statement =connection.createStatement();

                      String insert ="INSERT INTO `workout`.`workoutlogs`" + " (`SetNumber`, `RepNumber` , `WeightAmount`)"
                              + "VALUES('" +field_setNumber+"','"+field_repNumber+"','"+field_weightAmount+"')";
                      statement.executeUpdate(insert);

                      int workoutID = insertQueryGetId("SELECT workoutID FROM workout");

                      String insert2 ="INSERT INTO `workout`.`workoutlogs`" + " (`WorkoutID`)"
                              + "VALUES('" +workoutID+"')";
                      statement.executeUpdate(insert2);

                      connection.close();

              }catch(Exception e) {
                      System.out.println(e);}
      }

      public int insertQueryGetId(String query) throws ClassNotFoundException, SQLException {

              Class.forName("com.mysql.cj.jdbc.Driver");
              Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/workout","root","");
              Statement statement =connection.createStatement();

              int workoutID=0;
              int result=-1;

              try {
                      workoutID = statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

                      ResultSet rs = statement.getGeneratedKeys();
                      if (rs.next()){
                              result=rs.getInt(1);
                      }
                      rs.close();

                      statement.close();
              } catch (Exception e) {
                      e.printStackTrace();
              }
              return result;
      }

私が試したこと:

これにはステートメントを使用してみましたが、機能させるにはステートメントを準備する必要があるかもしれないと考えていますが、これについてはよくわかりませんので、ガイダンスが必要です。

解決策 1

見積もり:
C#
insertQueryGetId("SELECT workoutID FROM workout")
...
workoutID = statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

あなたは SELECT へのクエリ executeUpdate 方法。 このエラーは、これがサポートされていないことを明確に示しています。

通り ドキュメント[^]、実際に渡す必要があります INSERT このメソッドへのステートメントで、 RETURN_GENERATED_KEYS オプションを選択してから、返されたキーを読み取ります。 ドキュメントにこれを行う方法の例があります。

しかし、もっと大きな問題があります: あなたのコードはほぼ確実に脆弱です。 SQL インジェクション[^]. 一度もない 文字列連結/補間を使用して SQL クエリを作成します。 いつも パラメータ化されたクエリを使用します。

SQL インジェクションについて知りたいことすべて (ただし、質問するのをためらっていました) | トロイ・ハント[^]
専門用語なしで SQL インジェクションを説明するにはどうすればよいですか? | | 情報セキュリティ スタック交換[^]
クエリのパラメーター化のチート シート | OWASP[^]

コメント

タイトルとURLをコピーしました