2010-08-11 109 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