我正在创建一个简单的注册框架,将记录添加到数据库中。每次运行在数据库中添加记录的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");
}
}
每次注册新员工(用户)时,都会显示“错误创建或运行语句:......”,但我可以在员工列表中找到新添加的员工。
可能导致此问题的原因是什么?
答案 0 :(得分: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();
}
现在自动完成finally
的结束。
特别是关于您的异常,您可以通过调用executeQuery
来执行INSERT。此方法将语句发送到正确执行它的DB,但它对JDBC的响应不是ResultSet。这是爆炸的地方,已经插入记录。由于您处于自动提交模式,因此无需回滚事务。课程:始终使用交易。
答案 1 :(得分:2)
您需要将executeUpdate用于SQL INSERT
int rowCount = stmt.executeUpdate(sql);
答案 2 :(得分:1)
我讨厌看到以这种方式编写的代码。你没有问过这个,我的评论不会解决你的问题,但我认为需要说。
通过将持久性代码放在Swing Listener方法中,您将为自己创建一个维护噩梦。
更好的想法是以一种给予他们单一责任的方式来思考对象。
获取持久性代码并将其移动到您可以自行开发和测试的单独类中。一旦它工作,给出需要它的类的引用。
您的代码将更加模块化,更易于测试,更具可重用性,并且不会让您难以理解。
鲍勃·马丁叔叔为此以及其他值得记住的想法提供了简洁的肺部疾病:SOLID。
答案 3 :(得分: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();
}