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

Requêtes MySQL Discussion :

Requete Marche sur WorkBench mais pas dans .Net


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut Requete Marche sur WorkBench mais pas dans .Net
    Voilà la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT @num := IF(Max(ARM_NUM) is null , 0 , Max(ARM_NUM)+1) FROM armateur;
    INSERT INTO armateur (ARM_ADRESSE, ARM_FAX, ARM_MAIL, ARM_NOM, ARM_NUM, ARM_TELEPHONNE) 
    VALUES ( "aaa","fff","mmm","nnn",@num,"ttt");
    Tous les champs sont des VarChar, ARM_NUM est un Integer.
    Dans WorkBench, ça insère l’enregistrement, mais dans une application WPF j’obtiens ceci :

    [MySql.Data.MySqlClient.MySqlException] = {"Fatal error encountered during command execution."}
    InnerException = {"Parameter '@num' must be defined."}

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Salut,

    C'est normal. Ce n'est pas une, mais 2 requêtes. Pas sûr que tu aies configuré ton driver lors de l'initialisation de la connexion...

    Pourquoi tu n'utilises pas un auto_increment pour générer des valeurs auto incrémentée au niveau de ta colonne arm_num ?

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    J'ai fini par utiliser l'auto_increment, que j’essaye d’éviter toujours, mais là je n’ai pas le choix.
    Ceci dit, j'ai l'habitude de faire ça sur sql server, et du transact SQL, ça marche super bien. Mais apparemment, MySQL ne tolère ce genre de choses que dans une procédure stockée et pas dans un Batch de requêtes

    Mais j'aimerais tout de même pouvoir utiliser ce genre de construction pour d'autres cas de figure, et je crains de devoir toujours avoir le même message. Comment peut-on faire ça en configurant le driver ?

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    L'auto-incrément sert à faire ça

    Il y a très peu de limitations, mais ce que tu fais n'est pas atomique au niveau des opérations, vu que tu n'as pas de transaction qui englobe tes actions, donc aucun garantie d'unicité... d'où l’auto-incrément...



    Une procédure se déclare avec create procedure et s'appel avec call. Va voir la doc.

    Si tu es dans une procédure, tu peux déclarer des variables locales avec declareau lieu d'utiliser une globale comme @num.

    De plus, si tu ne récupères qu'une ligne avec une requête, pour affecter une ou des variables, c'est mieux d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select val1,...,valn into var1,...,varn
    from tatable
    ...

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Je connais les procédures stockées

    Je ne veux pas créer des procédures stockées à chaque fois que j'ai un traitement de ce genre.

    vu que tu n'as pas de transaction qui englobe tes actions donc aucun garantie d'unicité
    Une transaction garantit l'unicité (le tout ou rien), mais je pense qu'elle n’empêche pas la lecture sale d'un autre utilisateur qui exécute le même transaction, autrement dit la même transaction exécutée par un autre utilisateur peut s'intercaler entre mon SELECTet mon INSERTtout en étant Atomique (tout ou rien) non ? C'est pour ça que les niveaux d'isolations et les verrous existent je pense.

    sur SQL Server, j'avais l'habitude de faire çà directement et l’exécuter comme on exécute une simple commande.
    J'encapsulais mes traitements dans des transactions qui utilisaient les CURSORS, les boucles, etc... sans pour autant créer des procédures stockées. Je faisais même des RAISEROR() personnalisés côté sql serveur après mes traitements pour réaliser mes contrôles.
    Ma question est : comment faire la même chose avec MySQL et est-ce qu’il permet déjà de faire ça ?

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    ça dépend du niveau d'isolation de la transaction...

    Hors procédural, tu ne peux pas utiliser de logique de commande pour contrôler ton code, ou faire de curseur, ou faire de l'interception d'état sql pour déclencher du code en conséquence...

    Mais pour ce que tu veux faire, l'auto incrémentation va bien...

    Tu n'as besoin d'un mécanisme dans le genre de celui que tu utilises que si tu crées un élément sur une table et que tu veux insérer son identifiant dans une autre...

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

Discussions similaires

  1. Un lien marche sur IE mais pas sur Firefox
    Par Arsofts dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/07/2009, 15h33
  2. [AJAX] Script marche sur Firefox mais pas sous IE
    Par obito dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 05/03/2009, 11h50
  3. Réponses: 1
    Dernier message: 23/09/2008, 21h37
  4. Positionnement d'un background qui marche sur FF mais pas sur IE6
    Par webstarfrog dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 17/07/2008, 10h23
  5. Calcul marche sur IE mais pas sur Firefox
    Par Akim13 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2008, 18h22

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