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

ASP.NET Discussion :

Requête SQL s'exécute deux fois


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 64
    Points
    64
    Par défaut Requête SQL s'exécute deux fois
    Bonjour à tous,

    Voilà, je souhaite incrémenter une table à chaque fois que j'arrive sur une page d'un produit afin de stocker des statistiques de mon site web.

    Pour cela, lorsque j'arrive sur ma page, je récupère le nom de mon produit, je vérifie si il a déjà été visité et j'incrémente son champ visites.
    Mais le problème, c'est qu'à chaque fois que j'arrive sur ma page, il est incrémenté de +2 et non de +1. J'ai l'impression que la page se charge deux fois.

    Voici le code :

    Ma classe Statistiques

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
     
    /// <summary>
    /// Summary description for Statistiques
    /// </summary>
    public class Statistiques
    {
    	public Statistiques()
    	{
     
    	}
     
        public bool checkStatProduit(string nom)
        {
            string request = "SELECT count(*) FROM stats_produits WHERE nom=@nom";
            IDbConnection Conn = DBTemplate.Connection();
            IDbCommand Cmd = DBTemplate.Command(request);
            IDataParameter param = Cmd.CreateParameter();
            param.ParameterName = "@nom";
            param.Value = nom;
            Cmd.Parameters.Add(param);
            Conn.Open();
            Cmd.Connection = Conn;
            int nbEnr = (int)Cmd.ExecuteScalar();
            if (nbEnr > 0)
                return true;
            else
                return false;
        }
     
        public void AddStatProduit(string nom)
        {
            IDbConnection Conn = DBTemplate.Connection();
            if (checkStatProduit(nom) == true)
            {
                string request = "UPDATE stats_produits SET visites = (visites+1) WHERE nom=@nom";
                IDbCommand Cmd = DBTemplate.Command(request);
                IDataParameter param = Cmd.CreateParameter();
                param.ParameterName = "@nom";
                param.Value = nom;
                Cmd.Parameters.Add(param);
                Conn.Open();
                Cmd.Connection = Conn;
                Cmd.ExecuteNonQuery();
            }
            else
            {
                string request = "INSERT INTO stats_produits (nom, visites) VALUES (@nom,@visites)";
                IDbCommand Cmd = DBTemplate.Command(request);
                IDataParameter param = Cmd.CreateParameter();
                param.ParameterName = "@nom";
                param.Value = nom;
                Cmd.Parameters.Add(param);
                IDataParameter param2 = Cmd.CreateParameter();
                param2.ParameterName = "@visites";
                param2.Value = 1;
                Cmd.Parameters.Add(param2);
                Conn.Open();
                Cmd.Connection = Conn;
                Cmd.ExecuteNonQuery();
            }
        }
    }
    Et mon appel dans le Page_Load

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected void Page_Load(object sender, EventArgs e)
    {
         Statistiques stat = new Statistiques();
         stat.AddStatProduit(nomProduit);
    }
    Merci beaucoup de votre aide

  2. #2
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 218
    Points : 247
    Points
    247
    Par défaut
    Essaye de mettre ton AutoEventWireup à false ?

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 64
    Points
    64
    Par défaut
    J'ai essayé avec AutoEventWireup à false, mais tout ce qui est dans mon Page_Load ne s'exécute pas et rien ne s'affiche à l'écran.

    Pour infos, dans mon Page_Load, j'ai aussi tout l'affichage dynamique des informations de mes produits.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 218
    Points : 247
    Points
    247
    Par défaut
    Pour que ton page_load se lance avec un EventWireUp à false, il faut le déclarer comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected override void OnLoad(EventArgs e)
            {}

  5. #5
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    protected void Page_Load(object sender, EventArgs e)
    {
    If(!IsPostBack)
    {
    Statistiques stat = new Statistiques();
    stat.AddStatProduit(nomProduit);
    }
    }

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 218
    Points : 247
    Points
    247
    Par défaut
    Le postback est une méthode pour éviter de relancer une fois le postback lancé, mais cela ne résout pas le problème du passage en double.

  7. #7
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    t'en es sur ? ^^

  8. #8
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 218
    Points : 247
    Points
    247
    Par défaut
    Disons qu'il faudrait plutôt trouver la raison du double passage dans le Page_Load plutôt que de passer par un contournement

  9. #9
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    disons qu'il faudrait le code de la page aspx pour trouver la solution.
    Je fais avec ce qu'on me donne

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 64
    Points
    64
    Par défaut
    Voici le code aspx de ma page

    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
     
    <%@ Page Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="true" CodeFile="Produits.aspx.cs" Inherits="Produits"%>
    <%@ MasterType VirtualPath="~/MasterPage.master" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div id="detailsProduits" runat="server" class="detailsPrd">
        <table style="width:100%;">
            <tr>
                <td id="libelleProduit" colspan="2" runat="server" class="libPrd"></td>
            </tr>
            <tr>
                <td rowspan="4" id="imageProduit" runat="server"></td>
                <td id="prixProduit" runat="server" class="prixPrd" style="width: 300px"></td>
            </tr>
            <tr>
                <td id="delaiProduit" runat="server" class="delaiPrd" style="width: 300px"></td>
            </tr>
            <tr>
                <td id="refProduit" runat="server" style="width: 300px"></td>
            </tr>
            <tr>
                <td id="panierProduit" runat="server" style="width: 300px"></td>
            </tr>
            <tr>
                <td colspan="2" align="left"><div id="descriptionProduitTitre" runat="server" class="descriptionPrd"></div><div id="descriptionProduitContent" runat="server" class="descriptionProduitsContentCss"></div></td>
            </tr>
            <tr>
                <td colspan="2"><div id="caracProduitTitre" runat="server" class="descriptionPrd"></div><div  id="caracProduitContent" runat="server" class="descriptionProduitsContentCss"></div></td>
            </tr>
        </table>
        </div>
    </asp:Content>
    Je viens de tester avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    protected override void OnLoad(EventArgs e)
            {}
    mais cela ne règle pas le problème.

    Mon champ s'incrémente toujours de 2 en 2 à chaque chargement de la page.

  11. #11
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    le double chargement se fait uniquement sur cette page ou sur toutes les pages?
    qu'y a t il dans ta masterpage ?

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 64
    Points
    64
    Par défaut
    il s'agit de ce site : bonplanmaison.com.

    Je ne fais l'ajout de stats uniquement sur une page produit.
    En naviguant dans le site, tu identifieras ce qu'il y a dans la MasterPage

Discussions similaires

  1. Exécuter une requête SQL lourde en plusieurs fois
    Par diabli73 dans le forum Général Java
    Réponses: 5
    Dernier message: 10/06/2010, 18h13
  2. Réponses: 0
    Dernier message: 25/02/2010, 19h07
  3. Réponses: 6
    Dernier message: 15/09/2009, 11h18
  4. servlet s'exécute deux fois
    Par Bubu017 dans le forum Struts 1
    Réponses: 4
    Dernier message: 21/07/2008, 09h07
  5. Script qui s'exécute deux fois ?
    Par ben53 dans le forum Langage
    Réponses: 1
    Dernier message: 29/01/2007, 15h56

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