2009-12-15 1 views
1

J'utilise JDBC en synchronisation avec MySQL pour ajouter et définir des lignes dans la table d'une base de données MySQL. Le problème est que je ne sais pas pourquoi il lance un Exception lorsque j'utilise des méthodes de la classe ResultSet pour ajouter des lignes à la table. Gardez à l'esprit que j'ai déjà essayé juste de lire la table via ResultSet méthodes, et, il a imprimé avec succès les valeurs de la cellule. Ce qui suit est le code concerne fragement:Problème avec l'ajout de lignes avec JDBC et MySQL?

public void run(){ 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = DriverManager.getConnection(     
       "jdbc:mysql://localhost:3306/temp_book_database","root","1234");    

     ResultSet set = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE).executeQuery("SELECT * FROM book_info"); 


     set.moveToInsertRow(); 
     set.updateString(1, "Osama's POV"); set.updateString(2, "Osama B Laden"); 
     set.updateInt(3, 2800); set.updateString(4, "Osama bin Laden's debute book on terrorism"); 
     set.insertRow(); set.moveToCurrentRow();set.beforeFirst(); 
     //I'm guessing the bottom while loop is not executed because the above is generating the Exception 
     while (set.next()){ 
      System.out.println(set.getString("Book_Title")+ set.getString("Book_Author")+ set.getString("MRP")+set.getString("Comments")); 
     } 

    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e){System.out.println("prob with code"); 
    e.printStackTrace();} 

Et voici la console:

prob with code 
com.mysql.jdbc.NotUpdatable: Result Set not updatable (referenced table has no primary  keys).This result set must come from a statement that was created with a result set type of  ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details. 
at com.mysql.jdbc.UpdatableResultSet.moveToInsertRow(UpdatableResultSet.java:1013) 
at testJDBCDriver.run(testJDBCDriver.java:21) 
at testJDBCDriver.main(testJDBCDriver.java:9) 

[UPDATE]

Après avoir ajouté la colonne id dans le tableau comme INTEGER AUTO_INCREMENT PRIMARY KEY l'ResultSet ajouté avec succès rangée à la table, maintenant, je veux juste savoir pourquoi MySQL n'accepte pas la demande d'ajouter une nouvelle ligne de ResultSet si la colonne id n'est pas présente dans la table?

+0

Est-ce vrai: "la table référencée n'a pas de clés primaires"? – Boden

+0

Je voudrais mettre la table avec un PK, comme un GUID et voir si cela aide –

+0

@ Boden Oui. Ce n'est pas une blague. Comme je l'ai mentionné, j'ai essayé d'utiliser SEULEMENT la boucle while, et, il a imprimé les cellules correctement – Catfish

Répondre

6

L'API JDBC 2.X avec Mysql ne fonctionne pas en mode de mise à jour si vous ne définissez pas de clé primaire dans la table.

+0

pourriez-vous me dire ce qu'est exactement * est * clé primaire? – Catfish

+1

La clé primaire d'une table relationnelle identifie de manière unique chaque enregistrement de la table. Il peut s'agir soit d'un attribut normal garanti unique (tel que le numéro de sécurité sociale dans une table ne contenant pas plus d'un enregistrement par personne), soit d'un attribut généré par le SGBD (comme un identificateur global unique ou GUID, dans Microsoft SQL Server). Les clés primaires peuvent être constituées d'un seul attribut ou de plusieurs attributs en combinaison. –

+0

Alors pourriez-vous me dire comment insérer des clés primaires à l'intérieur (je suppose) de chaque cellule. – Catfish