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 :

Query SQL sans connaitre les noms de colonnes


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 108
    Points : 74
    Points
    74
    Par défaut Query SQL sans connaitre les noms de colonnes
    Bonjour,

    Voila je developpe une application en JSP dans laquelle j'ai une série (disons un 20ene) de table très simple. A savoir une table avec un identifiant (auto inc numérique) et une colonne contenant un valeur alphanumérique (ex: 5, 'Item01'). Toutes ces tables ne contiennent donc que 2 colonnes de meme type, mais les noms de colonnes de sont pas les memes.

    J'aimerais pourvoir faire une petite fonction administrative qui fonctionnerait pour toutes. Du genre un fonction insert qui me permettrait d'ajouter un elmt dans la table dont le nom sera passé en parametre et donc la valeur a ajouter le sera également. C'est assez simple a faire mais voila, j'ai un souci du coté de ma query SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query ="INSERT INTO "+table+" VALUES ('','"+rec+"')";
    Mais voila ça coince a cause de mon champ id... J'ai essayé sans '' et ça ne passe pas non plus.
    (Ma DB est temporerement une db access)

    Voyez vous une solution facile a mettre en place, ou alors je dois commencer a récuperer les nom de colonne et définir les champs de ma table avant mon VALUES.

    J'espere que c'est assez clair.
    Merci!!

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben je ne suis pas certain que ce soit le cas pour tous les SGBD, mais normalement si tu ne spécifies pas de noms de colonnes tu dois donner une valeur à tous les champs.

    Donc à mon sens deux possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String query ="INSERT INTO "+table+" VALUES (null,'"+rec+"')";
    à priori devrait fonctionner, mais pas certain, à tester
    ou alors commencer par récupérer une description de la table (je connais pas la requête en access) pour avoir le nom de la colonne.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 19
    Points : 23
    Points
    23
    Par défaut
    jette un coup d'oeil du coté des Metadata

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 108
    Points : 74
    Points
    74
    Par défaut
    merci pour ta réponse mais ça ne marche pas.
    Voici l'erreur si je met le null:
    java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] You tried to assign the Null value to a variable that is not a Variant data type.
    Une autre idée?

  5. #5
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    ben si l'id est en autoincrement, tu peux simplement faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String requete = "INSERT INTO "+table+" (nomCol) VALUES ('"+rec+"')"
    seul truc, voir si le nom de la colonne est variant ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 108
    Points : 74
    Points
    74
    Par défaut
    J'oubliais, j'aimerais faire la mme chose pour un UPDATE & DELETE me faudrait donc un moyen de dire update le champ 2 where le champ 1 = mon id par ex.

    LE tout sans devoir donner le nom de ces champs...

  7. #7
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Citation Envoyé par Bravecounass
    jette un coup d'oeil du coté des Metadata
    Les MetaData c'est en select, pas en insert/update/delete ...

    Honnêtement, à part faire l'équivalent d'un describe table (ça doit bien exister en access non ?) juste avant (ou au pire peut etre un select de la premiere ligne de la table et regarder les MetaData) je ne vois pas vraiment de solution...

  8. #8
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Il faut passer par les metadata...
    Tu fais un "select * from " + laTable, tu récupères les metadata et tu construit la requête insert, update, delete à partir de là...
    D'ailleurs, en passant, je te suggère d'utiliser un preparedStatement parce que tu risques de rencontrer les problèmes classiques d'affectation par injection (style un texte avec ' -> boum !)

    A+

  9. #9
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Attention quand même au select full si la table peut être volumineuse

  10. #10
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas trop, mais il me semble qu'il se contente de faire le plan d'accès, il lance réellement la requête sur rs.next() (pas sûr...)
    Dans tous les cas, rien n'empêche (pour être sûr) de rejouter un "where ID=0" puisqu'on se fiche des données, seule la structure compte...

    A+

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/05/2011, 13h31
  2. Réponses: 5
    Dernier message: 21/09/2009, 04h03
  3. Réponses: 2
    Dernier message: 30/09/2008, 15h18
  4. Réponses: 7
    Dernier message: 12/04/2007, 15h04
  5. Réponses: 4
    Dernier message: 26/05/2006, 12h39

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