1

データベースにレコードを追加する簡単な登録フレームを作成しています。データベースにレコードを追加するSQLクエリを実行するたびにエラーメッセージが表示されますが、それでもレコードは追加されますが、そのため、プログラムは別のウィンドウを開くのではなく停止します。

コードのその部分は次のとおりです。

regButton.addActionListener(new ActionListener() {

@Override public void actionPerformed( ActionEvent e ) {
   //Execute when button is pressed
   if(   uNameField.getText().equals("")
      || new String(newPassField.getPassword()).equals("")
      || new String(repeatPassField.getPassword()).equals("") ) {
      errorLabel.setForeground(Color.red);
      errorLabel.setText("Some fields are left blank");
   }
   else if( new String(newPassField.getPassword()).equals(
            new String(repeatPassField.getPassword()))){
      Statement stmt;
      ResultSet res;
      try
      {
         //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE
         String username = uNameField.getText().toUpperCase();
         String password = new String(newPassField.getPassword()).toUpperCase();
         //SQL INSERT QUERY
         String sql;
         sql = "INSERT INTO Employees VALUES ('" +username +"','" +password +"');";
         stmt = con.createStatement();
         res = stmt.executeQuery(sql);
         System.out.println("Added to database!");
         con.close();
      }
      catch(SQLException exe) {
         System.out.println("Error creating or running statement: " + e.toString());
         try {
            con.close();
         }
         catch(Exception eex){}
      }
   }
   else {
      errorLabel.setForeground(Color.red);
      errorLabel.setText("Password missmatch");
   }
}

新しい従業員(ユーザー)を登録するたびに、この「ステートメントの作成または実行中にエラーが発生しました:.....」と表示されますが、新しく追加された従業員は従業員リストにあります。

この問題の原因は何ですか?

4

4 に答える 4

4

特定の問題に取り組む前に、いくつかの一般的なアドバイス:

Connection con = ...
try {
    // your stuff
}
catch (Exception e) {
  e.printStackTrace();
}
finally {
  try {
    con.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
}

現在の方法では、例外を飲み込むだけでなく、スタックトレースの出力も回避されます。またclose、例外に関係なく、一度だけ実行する必要があります。

Java 7を使用している場合、これははるかに簡単です。

try (Connetion con = ...) {
  // stuff to do
}
catch (Exception e) {
  e.printStackTrace();
}

aのクローズがfinally自動的に行われるようになりました。

特に例外については、を呼び出してINSERTを実行しますexecuteQuery。このメソッドはステートメントをDBに送信し、DBはそれを適切に実行しますが、JDBCへの応答はResultSetではありません。これは、レコードがすでに挿入された後、爆発する場所です。自動コミットモードであるため、ロールバックするトランザクションはありません。レッスン:常にトランザクションを使用します

于 2012-11-10T13:11:01.757 に答える
2

SQLINSERTにはexecuteUpdateを使用する必要があります

int rowCount = stmt.executeUpdate(sql);
于 2012-11-10T13:10:31.600 に答える
1

私はこのように書かれたコードを見るのが嫌いです。あなたはこれについて質問しませんでした、そして私のコメントはあなたの問題を解決しません、しかし私はそれが言われる必要があると思います。

Swing Listenerメソッドに永続性コードを配置することで、メンテナンスの悪夢を自分で作成しています。

より良いアイデアは、オブジェクトに単一の責任を与える方法でオブジェクトについて考えることです。

永続化コードを取得して、独自に開発およびテストできる別のクラスに移動します。動作したら、それを必要とするクラスへの参照を提供します。

コードはよりモジュール化され、テストが容易になり、再利用可能になり、理解するのに悪夢が少なくなります。

ボブ・マーチンおじさんは、これと覚えておく価値のある他のアイデアについて簡潔な記憶を持っています:SOLID

于 2012-11-10T13:15:57.997 に答える
0

なぜPreparedStatementを試してみませんか

try{
    //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE
     String username = uNameField.getText().toUpperCase();
     String password = new String(newPassField.getPassword()).toUpperCase();
     //SQL INSERT QUERY
     PreparedStatement pstmt = con.prepareStatement("insert into Employees values(?,?)");
     pstmt.setString(1,username);
     pstmt.setString(2,password);

     if(!pstmt.execute())
     {
       //means your code worked correctly
        System.out.println("Inserted successfully");
     }
     else
     {
           System.out.println("Unsuccessfull");
     }
   }
   catch(Exception ex)
   {
      ex.printStackTrace();
   }
于 2012-11-10T16:27:13.190 に答える