2010-08-11 92 views
0

我在将数据插入数据库时​​遇到问题。它返回的是正在插入1行,但是当我实际检查数据库时,实际上并未插入任何新行。JAVA - 插入数据库问题

这是我的更新功能:

public int update(String sqlStatement) { 
    int rows = 0; 
    try { 
     Statement st = this.conn.createStatement(); 
     rows = st.executeUpdate(sqlStatement); 
     this.conn.commit(); 
     st.close(); 
      } catch (Exception err) { 
     System.out.println("Got err doing update: " + err.getMessage()); 
    } 
    return rows; 
} 

下面是通过它的对象调用它的函数:

  db = new Database(); 
      int rows = 0; 
      String sql = "INSERT INTO tblStudent (firstName, lastName, username, password, isAdmin) "; 
     sql += String.format("VALUES ('%s', '%s', '%s', '%s', %d)", fName, lName, username, passwd, isAdmin); 
      System.out.println("Trying " + sql); 
      if((rows = db.update(sql)) == 0) { 
       System.out.println("Could not create new user"); 
       throw new Exception(); 
      } 
      System.out.println("Rows " + rows); 

正如我所说的,它的报告说,一个行插入到数据库,但实际上没有任何东西。该数据库是一个MS Access数据库。

任何帮助表示赞赏。

G

+2

首先,使用prepare语句而不是手动连接。 – h3xStream 2010-08-11 19:59:49

+1

当您在此应用程序之外检查数据库时,应用程序连接是否已关闭? 当您使用此连接从您的应用程序执行SELECT查询时,那里的数据是? – 2010-08-11 20:14:44

+0

在我进行插入之前,我做了一个select,检查数据库中是否存在某些用户。此选择正常工作,并正确地从同一个表中获取数据。 RE:使用prepare语句。我意识到还有其他方法可以做到这一点,但我想试着理解为什么这种特殊的方式不起作用。 – SynackSA 2010-08-11 20:18:46

回答

0

好的,解决了这个问题。

似乎你必须关闭连接。即使不被重用。

我增加了以下功能,数据库类:

public void close() { 
    try { 
     this.conn.close(); 
    } catch (Exception err) { 
     System.out.println("Error while closing connection: " + err.getMessage()); 
    } 
} 

,然后添加的接近等功能于一身finally从句:

 try { 
      db = new Database(); 
      int rows = 0; 
      String sql = "INSERT INTO tblStudent (firstName, lastName, username, password, isAdmin) "; 
      sql += String.format("VALUES ('%s', '%s', '%s', '%s', %d)", fName, lName, username, passwd, isAdmin); 
      System.out.println("Trying " + sql); 
      if((rows = db.update(sql)) == 0) { 
       System.out.println("Could not create new user"); 
       throw new Exception(); 
      } 
      System.out.println("Rows " + rows); 
     } catch (Exception err) { 
      System.out.println("Got err in registerUser: " + err.getMessage()); 
      return false; 
     } finally { 
      db.close(); 
     } 

使我不知道为什么有连选项然后提交,因为即使您已经告诉它提交,它实际上也不提交提交。

+0

请注意,此代码易受SQL注入攻击。用一个带有单引号的FistName做一个简单的测试。 – h3xStream 2010-08-11 20:40:24

+0

您需要确保您正在使用的db.update()方法中运行的任何代码也正在关闭它正在使用的所有数据库资源。 – MikeTheReader 2010-08-11 21:02:43