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 :

[JDBC API] Execute multiple queries


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut [JDBC API] Execute multiple queries
    Bonsoir.

    Je développe une application en Java qui, selon mes intentions actuelles, permettera d'exécuter des queries SQL sur une database cible (sqlite, oracle, mysql,... etc).

    Donc, mon appli a une text area ou l'utilisateur peut y insérer de l'SQL ensuite il lance l'exécution via un bouton (classique quoi...)

    Maintenant on arrive au problème que j'ai:

    En effet, après avoir demandé à certaines personnes on m'a répondu que JDBC ne permettait pas d'exécuter plusieurs queries d'un coup (un script entier on va dire). Oui, il y'a la fonctionnalité Statement.addBatch() puis ExecuteBatch() mais je retombe également sur un problème:
    En effet, si je dois exécuter mes queries l'une après l'autre (notez que les queries peuvent faire l'objet d'un mélange de SELECT, d'INSERT, d'UPDATE, de CREATE... etc) je dois alors parser l'input de l'utilisateur.

    Facile me diriez-vous:
    -> Je split sur ";" et je teste le premier keyword
    Je trouve cette solution super crâde, car:
    - Si j'ai un ";" dans par exemple une chaine: WHERE field_name LIKE 'cool;' c'est foutu même si le script est correcte

    Donc là il est clair que la solution qui reste envisageable c'est de s'amuser à développer un parseur de SQL... youpi !

    Si vous avez déjà utilisé le logiciel Win32 SQL Tools pour Oracle vous comprendriez le résultat auquel je veux arriver.

    Est-ce qu'il existe une autre solution qui permettera de passer outre cette limitation ?

    D'avance merci
    Compil your life guy!
    The Aures Project

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est plus un problème d'ihm que jdbc.
    Une solution simple consisterait à utiliser plusieurs JTextArea dans un JScrollPane par exemple (avec le layout qui va bien) pour enregistrer les commandes sql et un bouton pour créer dynamiquement et ajouter un nouveau JTextArea à la demande.
    Ensuite, il n'y a plus qu'à boucler sur le contenu et exécuter au travers d'un statement chaque requête.
    (un truc dans le genre )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merci pour ta réponse.

    Mais en fait déjà j'utilise Java-gnome. Mais ta solution c'est un peu de hack ^^ et ca *détruit* le concept de l'app, qui est d'avoir une sheet dans laquelle on insère notre code comme bon nous semble (comme si notepad) puis start et on exécute.
    Je teste sur SQLite actuellement et ca ne passe pas :/ le premier Query est exécuté mais pas le deuxième, pourtant la javadoc de statment.getMoreResults() spécule que c'est possible...
    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
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
     
    public class Main {
     
    	/**
             * @param args
             * @throws ClassNotFoundException 
             */
    	public static void main(String[] args) throws ClassNotFoundException {
     
    		try{
    			Class.forName("org.sqlite.JDBC");
    			Connection conn = DriverManager.getConnection("jdbc:sqlite:/home/goundy/temp/test.db");
    			Statement stat = conn.createStatement();
    			ResultSet rs;
    			boolean isResultSet;
    			int rowCount;
     
    			String strSql = "delete from test where name = 'Kilo';insert into test values(NULL, 'Kilo'); select * from test;";
    			isResultSet = stat.execute(strSql);
    			rowCount = stat.getUpdateCount();
    			do{
    				if (isResultSet){
    					rs = stat.getResultSet();
    					rs.close();
    					System.out.println("resulset");
    				}
    				else
    					System.out.println("rowCount = " + rowCount);
     
    				isResultSet = stat.getMoreResults();
    				rowCount = stat.getUpdateCount();
     
    			}while(isResultSet || rowCount > -1);
     
    			stat.close();
    			conn.close();
    			System.out.println("Done");
     
    		}catch (SQLException sqlEx){
    			System.out.println("Error: " + sqlEx.getMessage());
    			sqlEx.printStackTrace();
    		}
     
    	}
     
    }
    En output:
    rowCount = 1
    Done
    1 rowCount car le delete a réussit à deleter une entrée. Mais les statements suivant sont comme ignorés...
    Compil your life guy!
    The Aures Project

  4. #4
    Membre chevronné Avatar de Rei Angelus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 292
    Par défaut
    Tu peux inclure l'ensemble de tes queries dans une procédure stockée, la créer, l'exécuter et recupérer le résultats via statment.getMoreResults().

  5. #5
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Salut,
    Citation Envoyé par Rei Angelus Voir le message
    Tu peux inclure l'ensemble de tes queries dans une procédure stockée, la créer, l'exécuter et recupérer le résultats via statment.getMoreResults().
    Oui on m'a en effet préscrit ca aussi et je pense que je comprend mieux l'usage de getMoreResults()
    Mais en fait si je fais comme ca ca veut dire que pour Oracle et pgSQL par exemple ca va mais pas SQLite, firebird ou autre

    Au final je vais miser sur le parsing manuel en splittant sur les ";" terminaux

    merci pour vos réponses
    Compil your life guy!
    The Aures Project

  6. #6
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Ce topic date !
    Mais j'Update pour proposer une solution que j'avais trouvé après des heures de recherches...
    Une solution toute bête faut le dire:

    Trouvée là

    allowMultiQueries Allow the use of ';' to delimit multiple queries during one statement (true/false), defaults to 'false' false 3.1.1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Properties props = new Properties();
      props.setProperty("allowMultiQueries", "true");
      Connection connection = DriverManager.getConnection(url,props);
    Mes salutations
    Compil your life guy!
    The Aures Project

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Execution multiple sans boucle
    Par nacrotic dans le forum C
    Réponses: 2
    Dernier message: 09/01/2011, 18h51
  2. Réponses: 7
    Dernier message: 23/09/2009, 14h09
  3. Réponses: 3
    Dernier message: 25/05/2009, 12h37
  4. Réponses: 5
    Dernier message: 13/02/2007, 17h54

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