IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Problème SetObject() JDBC


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Points : 66
    Points
    66
    Par défaut Problème SetObject() JDBC
    Bonjour,

    Je crée une petite surcouche au connecteur JDBC mais je rencontre un gros souci.Avec l'utilisation de du setObjet apret vérification du type
    Voir la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean addArg(int i,Object o){
    dans la class ci-dessous

    Voici ma class de surcouche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
    package oms.data.processing.cloud.usage;
     
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.sql.Types;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
     
    import oms.conf.LoadConf;
    import oms.conf.LoadConf.Bdds;
     
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.PreparedStatement;
    import com.mysql.jdbc.Statement;
     
    public class ConnectPrincipale {
     
    	private Connection con;
    	private PreparedStatement preInstruction = null;
    	public final DateFormat dateFormatMysql = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
     
     
    	public ConnectPrincipale() {
     
    			Bdds infoBdd = LoadConf.Bdds.getInfo("principale");
     
    			System.out.println(infoBdd);
     
     
    			try {
    				this.con = (Connection) DriverManager.getConnection(infoBdd.urlConnection+infoBdd.bdd,infoBdd.user,infoBdd.password);
     
    			} catch (SQLException ex) {
    				System.err.println("==> SQLException: ");
    					while (ex != null) {
    							System.out.println("Message: " + ex.getMessage ());
    							System.out.println("SQLState: " + ex.getSQLState ());
    							System.out.println("ErrorCode: " + ex.getErrorCode ());
    							ex = ex.getNextException();
    							System.out.println("");
    			}			
    		}
    	}
    	public ArrayList<Object> execute(){
     
    		ArrayList<Object> arss = new ArrayList<Object>();
     
    		ResultSet rs;
    		try {
    			if(preInstruction != null){
    				rs = this.preInstruction.executeQuery();
    				for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
    					arss.add(rs.getArray(i));
    				}
    			}
    		} catch (SQLException ex) {
    			System.err.println("==> SQLException: ");
    			while (ex != null) {
    				System.out.println("Message: " + ex.getMessage ());
    				System.out.println("SQLState: " + ex.getSQLState ());
    				System.out.println("ErrorCode: " + ex.getErrorCode ());
    				ex = ex.getNextException();
    				System.out.println("");
    			}
    		}
     
    		return arss;
    	}
     
    	public Boolean execute(String requete){
    		Boolean valide=false;
     
    		try {
     
    			Statement instruction = (Statement) this.con.createStatement();
    			if(instruction.execute(requete)){
    				valide = true;
    			}
     
    		} catch (SQLException ex) {
    				System.err.println("==> SQLException: ");
    				while (ex != null) {
    					System.out.println("Message: " + ex.getMessage ());
    					System.out.println("SQLState: " + ex.getSQLState ());
    					System.out.println("ErrorCode: " + ex.getErrorCode ());
    					ex = ex.getNextException();
    					System.out.println("");
    				}
    			}
    		return valide;
    	}
     
    	public boolean preReq(String requete){
    		boolean valide = false;
    		try {
    			PreparedStatement preInstruction = (PreparedStatement) this.con.prepareStatement(requete);
    			valide = true;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		return valide;
    	}
     
    	/**
             * Fonction permettant d'ajouter un argument sans se préocupé du type d'obj
             * @param i Pointeur a l'de l'argument
             * @param o Objet
             * @return boolean
             */
    	public boolean addArg(int i,Object o){
    		boolean valide = true;
     
    		try {
     
    			if(o instanceof String){
     
    				this.preInstruction.setObject(i,o.toString(),Types.VARCHAR);
    				System.out.println(i+" ^ "+o);
     
    			}else if (o instanceof Date) {
     
    				Date d = (Date) o;
    				Timestamp time = new Timestamp(d.getTime());
    				System.out.println(i+" ^ "+d+" <=> "+time);
    				this.preInstruction.setObject(i,time,Types.TIMESTAMP);
     
    			}else if (o instanceof Integer) {
     
    				this.preInstruction.setInt(i, (Integer) o);
    				System.out.println(i+" ^ "+o);
     
    			}else{
    				System.out.println("Rien na marché "+i+" ^ "+o);
    			}
     
    		} catch (SQLException ex) {
     
    			System.err.println("==> SQLException: ");
    			while (ex != null) {
    				System.out.println("Message: " + ex.getMessage ());
    				System.out.println("SQLState: " + ex.getSQLState ());
    				System.out.println("ErrorCode: " + ex.getErrorCode ());
    				ex = ex.getNextException();
    				System.out.println("");
     
    			}
    		}
    		return (Boolean) valide;
    	}
     
    	public boolean close(){
    		Boolean valide=false;
     
    		try{
    			this.con.close();
    		}catch (Exception e) {
    			System.out.println("Problème de fermeture de la connection.");
    		}
     
    		return valide;
     
    	}
    }
    Voici l'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		ConnectPrincipale theData = new ConnectPrincipale();
    		theData.preReq("INSERT INTO SampleProgressDates(date,nombre_element_traiter,nombre_element_perdu) VALUES ( ? , ? , ?)");
    		@SuppressWarnings("deprecation")
    		Date d = new Date(1990, 8, 13, 20, 10, 11);
    		theData.addArg(1,d);
    		theData.addArg(2,22);
    		theData.addArg(3,15);
    		//theData.execute();
    Voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in thread "main" java.lang.NullPointerException
    	at oms.data.processing.cloud.usage.ConnectPrincipale.addArg(ConnectPrincipale.java:129)
    	at oms.data.processing.cloud.usage.SampleProgressDate.saveBdd(SampleProgressDate.java:29)
    	at oms.exec.test.TestMysql.<init>(TestMysql.java:16)
    	at oms.exec.run.main(run.java:77)
    j'ai tester pas mal de cas de figure il se trouve que l'erreur arrive lors de l'utilisation de this.preInstruction.setObject();
    Et me retourne l'erreur java.lang.NullPointerException.

    J'avoue ne pas bien comprendre ce qui dérange :s es que le fait que la connection sois géré dans un objet appart et non dans l'objet courant peut poser problème ?

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Dans ton code tu mélanges paramètres locales et attribut d'instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PreparedStatement preInstruction = (PreparedStatement) this.con
    					.prepareStatement(requete);
     
    //
     
    this.preInstruction.setObject(...)
    L'attribut d'instance "this.preInstruction" est tout le temps null !!!




    D'autres remarques sur ton code :
    • Il ne faut pas importer directement depuis com.mysql.jdbc, mais de java.sql
    • @SuppressWarnings("deprecation") c'est le mal !!!
    • Tu ne libère jamais tes Statement/ResultSet avec des try/finally
    • Tu vérifies le type avant d'appeler setObject() en précisant le type... alors que tu pourrais utiliser directement setObject(int,Object) qui fait déjà cela !
    • Ta gestion des exceptions n'est pas tip-top. Tu te contentes d'afficher un message mais tu continues tous les traitements comme si de rien n'était. Il serait préférable de laisser remonter les exceptions.
    • Evites d'utiliser des variables d'instances sur des ressources critiques comme cela. Car cela complexifie la gestion de leurs fermetures.




    Perso dans ce cas précis j'aurais plutôt écris quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public boolean execute(String requete, Object...args) throws SQLException {
    		PreparedStatement ps = this.con.prepareStatement(requete);
    		try {
    			int i=1;
    			for (Object arg : args) {
    				ps.setObject(i, arg);
    				i++;
    			}
    			return ps.execute();
    		} finally {
    			ps.close();
    		}
    	}

    a++

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup pour toutes tès remarques je suis encore novice dans la programmation en java et ceci vas m'être très utile.
    En revanche qu'es que tu veux dir par la
    Evites d'utiliser des variables d'instances sur des ressources critiques comme cela.
    ?

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ben il faut fermer tout ce qui est Statement/ResultSet/Connection avec un try/finally ou en définissant une méthode close() à appeler explicitement.

    Si tu commences à mettre tout cela en attribut c'est difficile de gérer cela proprement. Il est préférable de limiter cela à des variables locales à une méthode autant que possible.

    a++

Discussions similaires

  1. Problème lenteur JDBC / ACCESS / ResultSet next()
    Par SebastianPx dans le forum JDBC
    Réponses: 11
    Dernier message: 22/04/2009, 20h29
  2. problème Name jdbc is not bound in this Context
    Par twist83 dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 19/11/2008, 18h30
  3. Problème drivers Jdbc/Oracle
    Par kalikut dans le forum JDBC
    Réponses: 2
    Dernier message: 17/08/2007, 15h05
  4. Réponses: 6
    Dernier message: 14/11/2006, 16h58
  5. problème servlet + JDBC sur tomcat
    Par pellec dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 09/08/2006, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo