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,后者会正确执行它,但它对 JDBC 的响应不是 ResultSet。这就是它爆炸的地方,在记录已经插入之后。由于您处于自动提交模式,因此没有要回滚的事务。教训:总是使用事务

于 2012-11-10T13:11:01.757 回答
2

您需要对 SQL INSERT使用executeUpdate

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

我讨厌看到这样写的代码。你没有问这个,我的评论不会解决你的问题,但我认为有必要说一下。

通过将持久性代码放入 Swing 侦听器方法,您正在为自己制造维护噩梦。

一个更好的想法是以赋予它们单一职责的方式来考虑对象。

获取您的持久性代码并将其移动到一个单独的类中,您可以自行开发和测试。一旦它开始工作,给需要它的类一个引用。

您的代码将更加模块化,更容易测试,更可重用,并且更容易理解。

Bob Martin 叔叔对这个和其他值得记住的想法有一个简洁的记忆: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 回答