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

Java Discussion :

Exécuter requête SQLServer avec Java


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut Exécuter requête SQLServer avec Java
    Bonjour,

    Je ne sais pas si je me trouve au bon endroit dans le forum mais je vais vous expliquer mon problème depuis le début.

    Je voulais trouver un équivalent en SQLServer de la fonction EXPLAIN en MySQL et on m'a donné en réponse cette requête: (car je code en java et je voudrais stocker le résultat dans un objet java)
    SET SHOWPLAN_XML ON;
    DECLARE @T TABLE (C XML);
    INSERT INTO @T
    EXEC ('SELECT * FROM sys.databases');
    SELECT * FROM @T;

    Malheureusement je n'arrive pas à l'exécuter en passant par java.
    Ma connexion à la Base de Données (que ce soit en SQLServer 2000 ou 2005) fonctionne avec le driver "net.sourceforge.jtds.jdbc.Driver"

    Donc voilà je voudrais savoir si vous pouvez m'aider à exécuter cette requête en passant par java et en stockant le résultat dans un objet java (une liste serait idéale)

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on peux voir le code qui l'exécute? Et l'erreur que tu as.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut
    En fait j'ai essayé différentes méthodes: (je n'ai pas garder tous mes tests als je vais essayer de faire un résumé :s )
    - j'ai utilisé "SqlMapSession().queryForObject(...)"
    En exécutant les requêtes une par une mais du coup il me disait que @T n'était pas déclaré pour le INSERT
    - ensuite j'ai essayé avec Statement "stmt" : "stmt.executeQuery(...)"
    ce qui m'a donné le même résultat
    - et enfin on m'a dit d'utiliser des procédures stockées (avec PreparedStatement) ou commandtext mais alors là je bloque totalement... je ne sais pas comment faire

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut
    voilà un exemple de ce que j'ai fait:

    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
    List<?> result = null;
    		List <String> tempResu = new ArrayList<String>();
     
    		try {
    			getSqlMapSession().queryForObject("executeRequeteSQLServer", "SET SHOWPLAN_XML ON");
    			getSqlMapSession().queryForObject("executeRequeteSQLServer","DECLARE @T TABLE (C XML)");
    			getSqlMapSession().queryForObject("INSERT INTO @T EXEC ('SELECT * FROM sys.databases')"); 
    			result = getSqlMapSession().queryForList("SELECT * FROM @T");
    			getSqlMapSession().queryForObject("executeRequeteSQLServer", "SET SHOWPLAN_XML OFF");
    		}catch(Exception e) {
    			tempResu.add("ERREUR LORS DE L'EXECUTION DU EXPLAIN: ");
    			System.out.println(e);
    			result = tempResu;
    		}
    		System.out.println("resultat: " + result);
    		return result;
    et voilà l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    com.ibatis.sqlmap.client.SqlMapException: There is no statement named INSERT INTO @T EXEC ('SELECT * FROM sys.databases') in this SqlMap.
    resultat: [ERREUR LORS DE L'EXECUTION DU EXPLAIN: ]

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut
    ou sinon j'ai créer cette procédure stockée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE explainSQLServer 
    	@QUERY VARCHAR(8000)
    AS
    BEGIN
    	SET SHOWPLAN_XML ON;
    	DECLARE @T TABLE (C XML);
     	INSERT INTO @T 
    	EXEC (@QUERY);
     	SELECT * FROM @T;
    END
    et exécuté ce code:

    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
    public List<?> explain(String req) throws SQLException {
    		List<?> result = null;
    		List <String> tempResu = new ArrayList<String>();
     
    		try {
    			  JtdsCallableStatement cstmt = (JtdsCallableStatement) connexion.prepareCall("{call explainSQLServer(?)}");
    		      cstmt.setString(1, req);
    		      cstmt.execute();
    		      cstmt.close();
    		}catch(Exception e) {
    			System.out.println(e);
    			tempResu.add("ERREUR LORS DE L'EXECUTION DU EXPLAIN");
    			result = tempResu;
    		}
    		return result;	
    	}
    ce qui me donne cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: Procédure stockée*'explainSQLServer' introuvable.
    J'ai enregistré la procédure dans l'endroit proposé par défaut par SQL Server Management Studio

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Salut,

    C'est quoi la fonction "getSqlMapSession()" ?

    Et pour gagner un peu de temps, est ce que tu peux aussi poster le code de la classe que getSqlMapSession retourne ?
    Parce que d'apres l'erreur postée, j'ai l'impression que c'est plutot la fonction queryForObject qui est mal utilisée.

    a+

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut
    En fait getSqlMapSession(), elle retourne l'objet SqlMapSession utilisé durant la connexion à la base de données (c'est une classe prédéfinie par java).

    Tout ce que je peux te donner dessus c'est ça :

    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
    private SqlMapSession sqlMapSession;
     
     
    public void connect()throws JSAException, ClassNotFoundException{	
    		try { 
    			this.creerConfigXML();
    			Reader reader = new InputStreamReader(new FileInputStream(configXML));
    			sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
     
    			connexion = DriverManager.getConnection(url,Parametres.getInstance().get(Parametres.usernameKey),password);
    		  //Connection connexion = DriverManager.getConnection(url,Parametres.getInstance().get(Parametres.usernameKey),password);
    			sqlMapSession= sqlMapper.openSession(connexion);
     
    			reader.close();
    			configXML.deleteOnExit();
     
    		} catch (FileNotFoundException e) {
    			throw new JSAException("Erreur durant l'initialisation de la configuration du lien avec la base de données. Cause: ", e);
    		} catch(SQLException e){
    			throw new JSAException("Erreur durant l'initialisation de la configuration du lien avec la base de données. Cause: ", e);
    		} catch (IOException e){
    			e.printStackTrace();
    			throw new JSAException("Erreur durant l'initialisation de la configuration du lien avec la base de données. Cause: ", e);
    		}
     
    	}

  8. #8
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Il faudrait regarder dans tes fichiers xml.

    J'ai jeté un oeil sur queryForObject et cette fonction attend un parametre id, pas une requete. A mon avis, dans un fichier xml, tu dois avoir une liste de requetes qui ont un id. En appelant queryForObject avec l'id de l'une d'elles, tu l'execute.

    Si tu ne trouves pas, tu peux essayer de poster le ou les fichiers xml utilisé.

    a+

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 13
    Par défaut
    alors voilà mon code xml - "requetesSQLServer.xml" (je ne suis pas sûre de moi)

    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
    <select id="explainOnSQLServer" parameterClass="String" resultClass="java.util.HashMap" remapResults="true">
    		SET SHOWPLAN_XML ON
    	</select>
     
    	<select id="explainDeclareSQLServer" parameterClass="String" resultClass="String" remapResults="true">
    		DECLARE @T TABLE (C XML)
    	</select>
     
    	<select id="explainInsertSQLServer" parameterClass="String">
    		INSERT INTO @T EXEC ('SELECT * FROM sys.databases')
     	</select>
     
     	<select id="explainSelectSQLServer" parameterClass="String">
    		SELECT * FROM @T
    	</select>
     
    	<select id="explainOffSQLServer" parameterClass="String">
    		SET SHOWPLAN_XML OFF
    	</select>
    voilà le code en java que j'ai exécuté:

    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
    public List<?> explain(String req) throws SQLException {
    		List<?> result = null;
    		List <String> tempResu = new ArrayList<String>();
     
    		try {
    			getSqlMapSession().queryForObject("explainOnSQLServer");
    			getSqlMapSession().queryForObject("explainDeclareSQLServer");
    			System.out.println("plouc");
    			getSqlMapSession().queryForObject("explainInsertSQLServer");
    			System.out.println("plouc 2");
    			getSqlMapSession().queryForObject("explainSelectSQLServer");
    			getSqlMapSession().queryForObject("explainOffSQLServer");
    		}catch(Exception e) {
    			System.out.println(e);
    			tempResu.add("ERREUR LORS DE L'EXECUTION DU EXPLAIN");
    			result = tempResu;
    		}
    		return result;	
    	}
    Et voilà ce qui ressort ^^:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    10:42:41,714 INFO  [main] Main  - javax.xml.transform.TransformerFactory=null
    10:42:41,730 INFO  [main] Main  - java.endorsed.dirs=C:\Program Files\Java\jdk1.6.0\jre\lib\endorsed
    10:42:41,761 INFO  [main] Main  - launchFile: C:\Documents and Settings\eescolivet\workspace\.metadata\.plugins\org.eclipse.wst.xsl.jaxp.launching\launch\launch.xml
    10:42:47,730 FATAL [main] Main  - No embedded stylesheet instruction for file: file:/C:/Documents and Settings/eescolivet/workspace/jsa-core/src/main/resources/sql.rules.dynamic/requetesSQLServer.xml
    org.eclipse.wst.xsl.jaxp.debug.invoker.TransformationException: No embedded stylesheet instruction for file: file:/C:/Documents and Settings/eescolivet/workspace/jsa-core/src/main/resources/sql.rules.dynamic/requetesSQLServer.xml
    	at org.eclipse.wst.xsl.jaxp.debug.invoker.internal.JAXPSAXProcessorInvoker.transform(JAXPSAXProcessorInvoker.java:225)
    	at org.eclipse.wst.xsl.jaxp.debug.invoker.internal.JAXPSAXProcessorInvoker.transform(JAXPSAXProcessorInvoker.java:186)
    	at org.eclipse.wst.xsl.jaxp.debug.invoker.internal.Main.main(Main.java:73)
    Caused by: org.eclipse.wst.xsl.jaxp.debug.invoker.TransformationException: No embedded stylesheet instruction for file: file:/C:/Documents and Settings/eescolivet/workspace/jsa-core/src/main/resources/sql.rules.dynamic/requetesSQLServer.xml
    	at org.eclipse.wst.xsl.jaxp.debug.invoker.internal.JAXPSAXProcessorInvoker.transform(JAXPSAXProcessorInvoker.java:214)
    	... 2 more
    Je ne comprends pas ce qu'ils veulent dire :s

  10. #10
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Visiblement, le fichier xml ne lui plait pas. Mais n'ayant jamais utilisé cette librairie, je ne peux pas t'aider

    Pour info, un petit coup de google semble dire qu'il ne faut pas ouvrir les fichiers xml dans eclipse avant de lancer le programme. Sinon, ca fait cette exception. Si tu utilises cet IDE et que tu as un fichier ouvert, a essayer...

Discussions similaires

  1. Problème exécution requête SQL avec HSQLDB
    Par montis dans le forum JDBC
    Réponses: 1
    Dernier message: 23/03/2012, 09h37
  2. Requête SELECT avec java
    Par jowelle dans le forum Langage SQL
    Réponses: 9
    Dernier message: 13/11/2011, 00h01
  3. Requête SQL avec JAVA
    Par bdptaki dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 27/02/2011, 14h52
  4. [AC-2007] Exécution requêtes action avec le Runtime
    Par Baillot Philippe dans le forum Runtime
    Réponses: 5
    Dernier message: 03/09/2010, 21h06
  5. Exécuter un .exe avec java
    Par chebmo1986 dans le forum Langage
    Réponses: 1
    Dernier message: 29/04/2009, 17h05

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