2017-07-16 1 views
1

J'ai rencontré un problème lié à la base de données.En fait, lorsque je mets à jour l'enregistrement, il affiche l'exception "java.sql.sqlsyntaxerrorexception: comparaison entre numeric et char (ucs_basic) ne sont pas pris en charge » voici mon code:java.sql.sqlsyntaxerrorexception: la comparaison entre numeric et char (ucs_basic) n'est pas prise en charge

conn = JavaConnectD.Connerdb(); 

    int p = JOptionPane.showConfirmDialog(null, "Do you really want to update this record", "UPDATE", JOptionPane.YES_NO_OPTION); 
    if(p==0){ 
    try{ 

     String sql="UPDATE SANDEEP.STUDENTRECORD SET REGTYPE='"+reg_type.getSelectedItem().toString()+"',SESSION='"+combo_session.getSelectedItem().toString()+"',STUDENTID='"+tf_sid.getText()+"',NAME='"+tf_name.getText()+"'," 
       + "CLASS='"+combo_class.getSelectedItem().toString()+"',FNAME='"+tf_fname.getText()+"',MNAME='"+tf_mname.getText()+"',DOB='"+(((JTextField)txt_Date.getDateEditor().getUiComponent()).getText())+"',ADDRESS='"+tf_adrss.getText()+"',MOBILE='"+tf_mobile.getText()+"',PHONE='"+tf_phone.getText()+"',REGFEE='"+tf_reg.getText()+"',ADDMISSION='"+tf_addmision.getText()+"' where STUDENTID='"+tf_sid.getText()+"' "; 
     pst=conn.prepareStatement(sql); 
     pst.executeUpdate(); 

     JOptionPane.showMessageDialog(null, "Record Updated"); 
     tf_sid.setText(""); 
     tf_name.setText(""); 
     tf_fname.setText(""); 
     tf_mname.setText(""); 
     tf_adrss.setText(""); 
     tf_mobile.setText(""); 
     tf_phone.setText(""); 
     tf_reg.setText(""); 
     tf_addmision.setText(""); 

    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 
    } 

J'utilise NetBeans 7.1 et base de données intégrée derby

s'il vous plaît me dire où est je écris mal. Si vous avez besoin d'autres informations, n'hésitez pas à demander.

Merci

+0

Qu'est-ce que tu ne comprends pas dans le message d'erreur? (Comme une note de côté, vous devriez lire sur l'injection sql) –

+1

Comme une conjecture sauvage, je parie que STUDENTID étant un nombre donc pas 'STUDENTID = '" + tf_sid.getText() + "'' –

+0

réellement im pas bon dans la programmation . quelle méthode est utilisée pour résoudre ceci ou comment? –

Répondre

1

Vous devez imprimer la valeur de votre droit de variable sql après l'initialisation, et juste avant que vous avez appelé la méthode prepareStatement sur elle.

Vous le verrez ressemble UPDATE SANDEEP.STUDENTRECORD SET REGTYPE='v1',SESSION='v2',STUDENTID='v3',NAME='v4',CLASS='v5',FNAME='v6',MNAME='v7',DOB='v8',ADDRESS='v9',MOBILE='v10',PHONE='v11',REGFEE='v12',ADDMISSION='v13' where STUDENTID='v14'

Ceci est une façon maladroite de construire une instruction SQL pour plusieurs raisons. Comme d'autres commentateurs l'ont noté, il n'est pas sécurisé, car un attaquant peut fournir une valeur contenant un guillemet simple dans la valeur, ce qui supprime toute l'instruction et lui fait faire quelque chose de totalement différent (cela s'appelle "SQL"). Injection Attack "

Aussi, et plus directement lié à votre question, vous essayez de spécifier chaque valeur unique pour votre UPDATE comme une chaîne littérale, mais il semble que certains des types de données des colonnes de votre tableau sont types de données non string

Probablement, certaines de vos colonnes sont de type INTEGER ou de type DATE, etc. Pour ces colonnes, vous ne souhaitez pas fournir de valeurs de chaîne, vous souhaitez fournir des valeurs numériques, des valeurs de date, etc.

La méthode appropriée pour utiliser cette fonction consiste à utiliser des espaces réservés aux marqueurs de paramètres dans votre instruction, à la place de chacune de ces valeurs, et d'utiliser les méthodes appropriées setInt, setString, setDate etc pour fournir les valeurs réelles, après avoir préparé l'instruction et avant d'appeler executeUpdate.

Voir ce document pour un tutoriel complet: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

+0

désolé pour une réponse tardive, vos informations m'aident maintenant mon code courir –