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

C# Discussion :

requête (mySql sous c#) pour plusieurs utilisateurs en même temps [Débutant]


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut requête (mySql sous c#) pour plusieurs utilisateurs en même temps
    Bonjour,

    Mon application Web donne un code de promo, par courriel, aux utilisateurs qui remplissent le formulaire.

    Ce code est unique, utilisable une seule fois par l'utilisateur. Il est stocké dans une base de données (BDD).

    Chaque fois qu'un utilisateur remplit le formulaire au 1er écran, l'application connecte à la bdd, et obtient la valeur du 1er champ, "cd_promo", du PREMIER ENGREGISTREMENT/ PREMIERE LIGNE de la table "client".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string mySqlReq = "SELECT cd_promo FROM client LIMIT 1";
    Une fois que le code a été envoyé, par courriel, à l'utilisateur, le programme supprime le code dans la BDD, dans le 2e écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string mySqlReqSupr = "DELETE FROM  client WHERE cd_promo=@CodeEnvoye;";
    Du coup, 2e utilisateur peut obtenir un autre code.

    Ça marche très bien. Par contre, j'ai une idée qui peut causer beaucoup de problèmes*:

    Mon problème est le suivant*: si par hasard, en même temps, 2 utilisateurs remplissent le formulaire au 1er écran, j'imagine qu'ils vont évidemment obtenir, tous les deux, le même code [QUI SE TROUVE DANS PREMIER ENREGISTREMENT] !!! Il faut éviter cela*:

    Autrement dit, il ne faut pas qu'ils reçoivent le même code qui se trouve dans 1er enregistrement.

    En plus de cela, j'imagine une autre chose qui irait se produire au 2e écran*: 1er utilisateur clique sur le bouton, l'email part dans sa boite de courriel et ce code est supprimé par la requête. Ensuite, 2er utilisateur clique sur le bouton, l'email part avec le même code de promo dans son boite de courriel et le code n'excite plus (puisque le 1er l'a supprimé avant lui) alors l'application peut afficher un message d'erreur.


    Alors que je dois faire pour que ma requête (mySqlReq) ne donne pas la même valeur s'il y a plusieurs utilisateurs remplissent en même temps le formulaire. En plus, ils ont évidemment le droit de remplir le formulaire en même temps, et nous n'avons pas le droit de les empêcher.

    Merci et bonne journée

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Une solution peut-être envisageable pour SQL Server serait d'ajouter un champ CDFLAG à la table (champ valant 0 lorsque le code est dispo et 1 lorsqu'il est vérouillé) et de de faire un ExecuteQuery avec :
    "UPDATE client SET CDFLAG=1 WHERE CDFLAG=0 LIMIT 1 OUTPUT cd_Promo"

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Bonjour Graffito,

    Est-ce que votre exemple marche avec MySql server ?
    Si oui, comment je peux faire un champ CDFLAG dans MySql ?

    J'ai regardé dans ma table, il n'y pas de de type 'CDFLAG'. Il y a possibilité de 39 types, mais pas CDFLAG :

    voici les posibilités de type : TINYINT ; SMALLINT ; MEDIUMINT ; INT ; BIGINT ; DECIMAL ; FLOAT ; DOUBLE ; REAL ; BIT ; BOOL ; SERIAL ; DATE ; DATETIME ; TIMESTAMP ; TIME ; YEAR ; CHAR ; VARCHAR ; TINYTEXT ; TEXT ; MEDIUMTEXT ; LONGTEXT ; BINARY ; VARBINARY ; TINYBLOB ; MEDIUMBLOB ; BLOB ; LONGBLOB ; ENUM ; SET ; GEOMETRY ; POINT ; LINESTRING ; POLYGON ; MULTIPOINT ; MULTILINESTRING ; MULTIPOLYGON et EOMETRYCOLLECTION


    Je pense que j'ai trouvé la solution :
    faire une requête sql avec l’ordre aléatoire via Order by Rand ()
    Donc s'il y a plusieurs consultations de formulaire en même temps par différents utilisateurs, le risque d'avoir plusieurs mêmes codes est très minimum...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string sqlBDD = "SELECT cd_promo FROM client order by rand() LIMIT 1";
    Qu'en vous dites sur cette solution?

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    C'est à ça que servent les transactions.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    CDFLAG était juste un nom pour un nouveau champ de type de INT (ou SMALLINT ou TINYINT) à ajouter à la table.

    "OUTPUT" n'existe pas en MySql.

    Les solutions seront donc plus complexes; En voici une évitant de recourir aux transactions :
    - on fait un SELECT ... LIMIT 1
    - on récupère ainsi un code promo et on l'inverse,
    - on fait un UPDATE ... SET codePromo=Code_promo_inversé WHERE codePromo=CodePromo_récupéré
    - on teste le retour de l'update pour voir le nombre d'enregistrements mis à jour,
    - si ce nombre est nul, on reboucle sur le SELECT.

    Qu'en vous dites sur cette solution?
    Non, noon, noooon
    On ne peut pas accepter une bug identifiée quelque soit son degré de probabilité. Si on tolère de telles dérives à tous les niveaux d'un projet, on va additioner les probabilités, et au final bonjour les dégats ...

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par aspkiddy Voir le message
    Je pense que j'ai trouvé la solution :
    faire une requête sql avec l’ordre aléatoire via Order by Rand ()
    Donc s'il y a plusieurs consultations de formulaire en même temps par différents utilisateurs, le risque d'avoir plusieurs mêmes codes est très minimum...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string sqlBDD = "SELECT cd_promo FROM client order by rand() LIMIT 1";
    Qu'en vous dites sur cette solution?

    Comme dit plus haut, tu ajoute un champs CDFLAG (ou tu l'appelle comme tu veux), que tu mets à jour dans une transaction et tu retourne le numéro mis à jour après le COMMIT; ainsi tu es sur de l'absence de collision.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Salut,
    C'est à ça que servent les transactions.
    C'est très intéressant, cet article...

    par contre, on ne peut pas appliquer, si je ne m'en trompe pas, dans mon cas puisqu'il s'agit d'une action qui commence dans un écran et qui se termine dans un autre écran*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    START TRANSACTION;
    SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
    UPDATE table2 SET summmary=@A WHERE type=1;
    COMMIT;

    Merci pour cet article,ctxnop.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par Graffito Voir le message
    CDFLAG était juste un nom pour un nouveau champ de type de INT (ou SMALLINT ou TINYINT) à ajouter à la table.

    "OUTPUT" n'existe pas en MySql.

    Les solutions seront donc plus complexes; En voici une évitant de recourir aux transactions :
    - on fait un SELECT ... LIMIT 1
    - on récupère ainsi un code promo et on l'inverse,
    - on fait un UPDATE ... SET codePromo=Code_promo_inversé WHERE codePromo=CodePromo_récupéré
    - on teste le retour de l'update pour voir le nombre d'enregistrements mis à jour,
    - si ce nombre est nul, on reboucle sur le SELECT.
    Merci pour vos explications, Graffito
    --- Alors j'ai ajouter une autre champs "cd_promo_vide" [ varchar(5) DEFAULT NULL]

    --- Je fait ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string sqlBDD = "SELECT cd_promo FROM client WHERE "cd_promo_vide"  IS NULL order by rand() LIMIT 1;
    Donc j'ai choisi un engresistrement par hasard du champ cd_promo et le champ cd_promo_vide est vide

    --- En fait, il faut faire une changement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE client SET code_test_vide = cd_promo WHERE  cd_promo = vChiffre;
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE client SET code_test_vide = vChiffre WHERE  cd_promo = vChiffre;
    ou bien mieux encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE client SET code_test_vide = '1' WHERE  cd_promo = vChiffre;
    N'est ce pas ?
    Par contre, je ne sais pas comment je peux faire 2 requêtes en même temps dans une seule connexion avec une variable locale "vChiffre" ?
    Il faut 2 connexions ?
    Voici le 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
    17
    18
    19
    20
    21
    22
    23
    24
    string mySqlReq = "SELECT cd_promo FROM client WHERE cd_promo_vide IS NULL  order by rand() LIMIT 1";
     
    MySqlCommand cmdCDpomo = new MySqlCommand(mySqlReq, connCDpomo);
     
    MySqlDataReader myReaderCDpomo;
     
    myReaderCDpomo = cmdCDpomo.ExecuteReader();
    string vChiffre;
     // Always call Read before accessing data.
    while (myReaderCDpomo.Read()) 
    	{
     
    	vChiffre = myReaderCDpomo.GetString(0);
     
    	ecranApageState.CodePromo = vChiffre;
     
    	// Faut il faire la 2e requête ici pour récupérer la valeur de vChiffre?
    	// il faut fermer la connections? donc il faut que je sorte de ma boucle while mais dans ce cas là, je ne peux pas récupérer la valeur de vChiffre
    	}
     
    // always call Close when done reading.
    myReaderCDpomo.Close();
    // Close the connection when done with it.
    connCDpomo.Close();
    Bonne soirée

  9. #9
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Cette solution est toujours complètement foireuse
    La seule solution valable est celle a base de transaction, tout autre solution n'est que de la bidouille. Je ne vois pas pourquoi l'action commence dans une page et se termine dans l'autre, la réservation d'un code promo est une seule action non dissociable, peut importe le nombre de requête qui doivent être faites.
    En premiere page tu obtiens le code (ce qui signifie SELECT + UPDATE).
    En seconde page ton code promo peut être transmis par variable de session ou autre mécanisme, peut importe.
    Si tu as pris un code promos et que tu veux annuler cette réservation, il te suffit de refaire un update.

    Quand au code, plusieurs remarques :
    - MET DES USINGS AUTOURS DES OBJETS DISPOSABLES !!!! (connection, commande, reader, etc...)
    - Les bases de données ca a été créé justement dans le but de permettre plusieurs connexion simultanées, il ne faut pas hésiter à ouvrir plusieurs connexion, même imbriquées.
    - Quand on peut éviter d'ouvrir pleins de connexion c'est mieux, je ne sais pas si MySql le supporte mais certains SGBD permettent d'avoir plusieurs commandes/readers sur la même connexion.

  10. #10
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour les commandes update et éventuellement Select, on peut utiliser ExecuteNonQuery et ExecuteNonQuery.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private static void CreateCommand(string queryString,
        string connectionString)
    {
        using (SqlConnection connection = new SqlConnection(
                   connectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }

  11. #11
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Y a-t-il une raison pour que les codes soient générés à l'avance dans une BDD ?

    Sinon, pq ne pas générer aléatoirement un code au moment du remplissage du formulaire ?

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Pongten Voir le message
    Y a-t-il une raison pour que les codes soient générés à l'avance dans une BDD ?

    Sinon, pq ne pas générer aléatoirement un code au moment du remplissage du formulaire ?
    Une génération alétoire non tracée ne garantie pas vraiment l'absence de collision, d'autant qu'on peut imaginer que pour des questions de commodité, il ne souhaite pas de code à 15 ou 20 chiffres.

    Pour d'autres raisons, toutes aussi évidentes, on ne peut pas utiliser des codes incrémentaux délivrés en séquence.

    Il faut donc tracer les codes délivrés.

  13. #13
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Entièrement d'accord, mais dès lors pourquoi ne pas générer un code au moment de la demande puis le stocker en BD pour éviter les collisions.

    Lors de la génération d'un code, il suffit alors de regarder si le code a déjà été généré ou pas..

    Mais peut-être y a-t-il une raison qui fait que les codes ont été générés à l'avance..

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Cette solution est toujours complètement foireuse.
    La seule solution valable est celle a base de transaction, tout autre solution n'est que de la bidouille.
    C'est vrai... je sais... mais dans mon cas...


    Citation Envoyé par ctxnop Voir le message
    Je ne vois pas pourquoi l'action commence dans une page et se termine dans l'autre,
    À cause de la structure de mon formulaire*: le formulaire a été fait par quelqu'un il y a 2 ans sans le module du code de promotion... Il est en production et je n'ai pas de droit de le rectifier.

    En outre, au 1er écran, l'utilisateur remplit leur identité, en entrant aussi leur code qu'ils ont obtenu par un autre courriel selon 3 campagnes (LIBE, MONDE et OBS)(par exemple, emailA) en remplissant le textBox (Code1erRecuEmailTextBox)
    Il clique sur le bouton de validation.

    On fait la connexion à la BDD pour avoir leur code unique de promotion. On passe au deuxième écran, il y a deux possibilités*:

    soit, leur code, qui est entré dans le textBox, n'est pas bon*: on affiche un message et un bouton pour le corriger (en le dirigeant au premier écran) s'il veut

    Soit, le code est bon, on affiche leur code 'Code1erRecuEmail' avec toutes les informations sur leur identité selon le 1er écran. Lorsqu'il paye,
    On envoie le courriel (par exemple emailB) avec leur code unique de promotion ensuite on supprime ce code dans ma BDD pour qu'un autre obtienne le même.


    Citation Envoyé par ctxnop Voir le message
    la réservation d'un code promo est une seule action non dissociable, peut importe le nombre de requête qui doivent être faites.
    En premiere page tu obtiens le code (ce qui signifie SELECT + UPDATE).
    Je n'arrive pas en même temps un select et un update parce que ma variable [vChiffre] se trouve dans la boucle [while] lorsque je fais le "select" du coup il faut que je fasse mon "Update" dans la boucle while!!! ce n'est pas 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
     
    string mySqlReq = "SELECT cd_promo FROM client WHERE cd_promo_vide IS NULL  order by rand() LIMIT 1";
     
    //..... 
    while (myReaderCDpomo.Read()) 
    	{
     
    	vChiffre = myReaderCDpomo.GetString(0);
     
    	ecranApageState.CodePromo = vChiffre;
     
    	// Faut il faire la 2e requête ici pour récupérer la valeur de vChiffre?
    	// il faut fermer la connections? donc il faut que je sorte de ma boucle while mais dans ce cas là, je ne peux pas récupérer la valeur de vChiffre
    	UPDATE client SET code_test_vide = '1' WHERE  cd_promo = vChiffre;
    	}
     
    // always call Close when done reading.
    myReaderCDpomo.Close();
    // Close the connection when done with it.
    connCDpomo.Close();

    Citation Envoyé par ctxnop Voir le message
    En seconde page ton code promo peut être transmis par variable de session ou autre mécanisme, peut importe.
    oui au 1er page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    ecranApageState.CodePromo = vChiffre;
     
     public struct ecranApageState
            {
    public string CodeReductionMySql;  
    	}
    ensuite je le récupère au 2e écran



    Citation Envoyé par ctxnop Voir le message
    Si tu as pris un code promos et que tu veux annuler cette réservation, il te suffit de refaire un update.

    Quand au code, plusieurs remarques :
    - MET DES USINGS AUTOURS DES OBJETS DISPOSABLES !!!! (connection, commande, reader, etc...)
    que veut dire cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using MySql.Data;
    using MySql.Data.MySqlClient;


    Citation Envoyé par ctxnop Voir le message
    - Les bases de données ca a été créé justement dans le but de permettre plusieurs connexion simultanées, il ne faut pas hésiter à ouvrir plusieurs connexion, même imbriquées.
    je ne peux pas le mettre dans while sinon il y a le message d'erreur
    Citation Envoyé par ctxnop Voir le message
    - Quand on peut éviter d'ouvrir pleins de connexion c'est mieux, je ne sais pas si MySql le supporte mais certains SGBD permettent d'avoir plusieurs commandes/readers sur la même connexion.


    ctxnop,Merci pour tes conseil

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par Pongten Voir le message
    Y a-t-il une raison pour que les codes soient générés à l'avance dans une BDD ?

    Sinon, pq ne pas générer aléatoirement un code au moment du remplissage du formulaire ?
    Oui Pongten,

    Les codes de promo ont été fournis par un autre site, et les utilisateurs vont utiliser ce code en allant dans ce site : c'est l'application de ce site va les comparent dans leur DBB pour voir si c'est le bon code...

  16. #16
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Citation Envoyé par aspkiddy Voir le message
    À cause de la structure de mon formulaire*: le formulaire a été fait par quelqu'un il y a 2 ans sans le module du code de promotion... Il est en production et je n'ai pas de droit de le rectifier.
    ...
    En outre, au 1er écran, l'utilisateur remplit leur identité, en entrant aussi leur code qu'ils ont obtenu par un autre courriel selon 3 campagnes (LIBE, MONDE et OBS)(par exemple, emailA) en remplissant le textBox (Code1erRecuEmailTextBox)
    Il clique sur le bouton de validation.
    ...
    On fait la connexion à la BDD pour avoir leur code unique de promotion. On passe au deuxième écran, il y a deux possibilités*:
    ...
    soit, leur code, qui est entré dans le textBox, n'est pas bon*: on affiche un message et un bouton pour le corriger (en le dirigeant au premier écran) s'il veut
    ...
    Soit, le code est bon, on affiche leur code 'Code1erRecuEmail' avec toutes les informations sur leur identité selon le 1er écran. Lorsqu'il paye,
    On envoie le courriel (par exemple emailB) avec leur code unique de promotion ensuite on supprime ce code dans ma BDD pour qu'un autre obtienne le même.
    Donc le code n'est pas obtenu en deux fois, sur la première page il rentre son code promo, il valide le formulaire, tu arrive coté serveur, tu exécute ta requête et tu send la page 2 en indiquant si le code est bon ou non. Conclusion, il n'y a bien qu'un seul passage, donc c'est en une fois.

    Citation Envoyé par aspkiddy Voir le message
    Je n'arrive pas en même temps un select et un update parce que ma variable vChiffre se trouve dans la boucle while lorsque je fais le "select" du coup il faut que je fasse mon "Update" dans la boucle while!!! ce n'est pas possible
    En même temps ta boucle while elle sert à rien vu ta requête retourne qu'un seul résultat (TOP 1)....
    Et si on suivait 5 minutes la documentation ?

    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
     
    string sqlSel = "SELECT machin FROM bidule;"
    string sqlUp = "UPDATE bidule SET truc = 'bouh' WHERE machin = ?machin;"
     
    using(MySqlConnection cnx = new MySqlConnection("<chaine de connection>"))
    {
        cnx.Open();
        using(MySqlTransaction trs = cnx.BeginTransaction())
        {
            try
            {
                string machin
                using(MySqlCommand cmd = new MySqlCommand(sqlSel, cnx, trs))
                {
                    machin = cmdSel.ExecuteScalar();
                }
     
                using(MySqlCommand cmdUp = new MySqlCommand(sqlUp, cnx, trs))
                {
                    cmdUp.Parameters.Add(new MySqlParameter("?machin", machin));
                    cmdUp.ExeuteNonQuery();
                }
                trs.Commit();
            }
            catch(Exception ex)
            {
                trs.Rollback();
            }
        }
     }
    Et voilà ce que j'entend par "mettre des using sur les objets disposables.

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Bon j'ai fais n'importe quoi avec mes gros doigts sur mon clavier...
    Si un admin/modo passe dans le coin, ce message est a supprimer, merci bien
    Tu as un bouton ad-hoc pour cela : choisir EDITER puis "Supresssion logique du message"; mais tu n'as que 72h pour cela.

  18. #18
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Tu as un bouton ad-hoc pour cela : choisir EDITER puis "Supresssion logique du message"; mais tu n'as que 72h pour cela.
    Ah oui tiens, je n'y avais jamais fait attention, merci de l'astuce

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Donc le code n'est pas obtenu en deux fois, sur la première page il rentre son code promo, il valide le formulaire, tu arrive coté serveur, tu exécute ta requête et tu send la page 2 en indiquant si le code est bon ou non. Conclusion, il n'y a bien qu'un seul passage, donc c'est en une fois.
    (...)
    Non pas du tout, je vois qu'il y a une confession dans mes explications :

    voila la situation :

    1- les utilisateurs reçoivent 1er code par le site A (je le nomme "code de clé" pour ne pas mélanger avec la 2e code (code de promo) qu’ils vont obtenir

    2- les utilisateurs viennent sur mon site (site B)
    3- au 1er écran, l'utilisateur remplit leur identité, en entrant aussi leur "code de clé" qu'ils ont obtenu par l"email du (site A) dans le textBox (Code1erRecuEmailTextBox).
    4 -Ils cliquent sur le bouton de validation.

    On fait la connexion à la BDD pour avoir leur "code unique de promotion".

    5- Deuxième écran s'affiche avec deux possibilités*:

    soit, leur "code de clé" n'est pas bon*: on affiche un message et un bouton pour le corriger (en le dirigeant au premier écran) s'il veut

    Soit, leur "code de clé" est bon, on affiche leur "code de clé" avec toutes les informations sur leur identité selon le 1er écran. Lorsqu'il paye,
    On envoie le courriel (du site B) avec "code unique de promotion" (2e code reçu mais cette fois-ci le code a été envoyé par le site B (par mon site))
    Ensuite, on supprime ce "code unique de promotion" dans ma BDD pour qu'un autre obtienne le même.

    6- Troisième écran s'affiche avec le message de confirmation " vous recevez votre "code unique de promotion".

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    En même temps ta boucle while elle sert à rien vu ta requête retourne qu'un seul résultat (TOP 1)....
    C'est vrai !!! Zut je n'ai pas fait attention, c'est un oublie : en fait au début, j'ai prévu ma requête sur deux champs d'où vient la boucle while... en suite j'ai changé ma requête sur un champ....

    Désolé...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Changement de codes pour plusieurs pages en même temps
    Par d-85a dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/05/2013, 23h38
  2. Application accessible par plusieurs utilisateurs en même temps..
    Par flamby6969 dans le forum Modélisation
    Réponses: 3
    Dernier message: 30/03/2009, 00h42
  3. plusieurs utilisateurs en mème temps
    Par Anthony17 dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 15h55
  4. Réponses: 4
    Dernier message: 14/10/2004, 17h36
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

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