2010-08-11 6 views
0

J'ai un problème lorsque j'insère des données dans une base de données. Il retourne que 1 ligne est insérée, mais quand je vérifie réellement la base de données, rien de nouveau n'a été réellement inséré.JAVA - insertion dans un problème de base de données

Voilà ma fonction de mise à jour:

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; 
} 

Et voici la fonction appeler via son objet:

  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); 

Comme je l'ai dit, il est de signaler qu'une seule ligne est insérée dans la base de données, mais rien n'est réellement là. Le DB est une base de données MS Access.

Toute aide appréciée.

G

+2

D'abord, utilisez l'instruction de préparation et non la concaténation manuelle. – h3xStream

+1

Lorsque vous vérifiez la base de données en dehors de cette application, la connexion des applications a-t-elle été fermée? Lorsque vous exécutez la requête SELECT à partir de votre application avec cette connexion, les données sont-elles présentes? –

+0

Avant de faire l'insertion, je fais une sélection, en vérifiant si certains utilisateurs sont présents dans la base de données. Cette sélection fonctionne correctement et obtient correctement les données de la même table. RE: utilisation de l'instruction prepare. Je me rends compte qu'il existe d'autres façons de le faire, mais j'aimerais essayer de comprendre pourquoi cette façon particulière ne fonctionne pas. – SynackSA

Répondre

0

Bon, corrigé le problème.

Semble que vous devez fermer la connexion. Même s'il n'est pas réutilisé.

I a ajouté la fonction suivante à la classe de base de données:

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

Et puis on ajoute la proximité des autres fonctions dans une clause 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(); 
     } 

Makes me demande pourquoi il y a même l'option à commettre alors, puisqu'il ne fait en réalité pas de commit même si vous lui avez dit de commettre.

+0

Sachez que ce code est vulnérable à l'injection SQL. Faites un test simple avec un FistName ayant une seule citation. – h3xStream

+0

Vous devez vous assurer que le code exécuté dans la méthode db.update() que vous utilisez ferme également les ressources de base de données utilisées. – MikeTheReader

Questions connexes