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

VB.NET Discussion :

Initialisation de variables [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 45
    Par défaut Initialisation de variables
    Salut, en fait dans mon application je fais une requête sur un serveur MySQL.
    Tout fonctionne bien, mais j'ai fait une petite remarque sur une variable qui garde à un certain moment la valeur de la précédente requête.
    Je m'explique pour un test j'effectue un critère de sélection sur la date:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from message where (DateMsg >= '2012-04-03' and DateMsg <= '2012-04-06');
    j'ai un résultat d'affichage de 187 élément vérifiant cette clause. => OK c'est vrai.

    Et voici un des événèment qui ne vérifie pas cette clause mais qui affiche le même résultat que la précende requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from message where (DateMsg >= '2012-04-05' and DateMsg <= '2012-04-06');
    Cette requête devrait me renvoyer 0 éléments mais elle me renvoie toujours 187 éléments. => Faux
    Sur mon serveur MySQL je refais ces galipettes, il ne se passe aucun problème.

    Je vous donne mon code pour une analyse et essayer de trouver ensemble d'où vient le problème et le corriger.
    Merci

    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
    Public Sub BD_Recherche(ByVal lstview As ListView)
            WaitBar.ProgressBar1.Minimum = 0
            Dim i As Integer
            Dim myCommand1 As New MySqlCommand
            Dim MyAdapter1 As New MySqlDataAdapter
            Dim myDataTable1 As New DataTable
            Dim strQuery1 As String
            Dim strCountQuery1 As String
            Dim cResulat1 As Integer = 0
     
            Try
     
                If Form1.CmbExpediteur.Text = "ALL" And Form1.CmbStatut.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg >='" & Form1.DtpDebut.Text & "' and DateMsg <='" & Form1.DtpFin.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg >='" & Form1.DtpDebut.Text & "' and DateMsg <='" & Form1.DtpFin.Text & "';"
     
                ElseIf Form1.CmbExpediteur.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and DLR='" & Form1.CmbStatut.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and DLR='" & Form1.CmbStatut.Text & "';"
                ElseIf Form1.CmbStatut.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and Expediteur='" & Form1.CmbExpediteur.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and Expediteur='" & Form1.CmbExpediteur.Text & "';"
                Else
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and Expediteur='" & Form1.CmbExpediteur.Text & "' and DLR='" & Form1.CmbStatut.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and Expediteur='" & Form1.CmbExpediteur.Text & "' and DLR='" & Form1.CmbStatut.Text & "';"
                End If
     
                myCommand1.Connection = conexion
                myCommand1.CommandText = strQuery1
                MyAdapter1.SelectCommand = myCommand1
                Dim CountQuery1 As New MySqlCommand(strCountQuery1, conexion)
                cResulat1 = CountQuery1.ExecuteScalar
                WaitBar.ProgressBar1.Maximum = cResulat1
     
                Dim myLine As ListViewItem
                Dim j As Double = 0
                MyAdapter1.Fill(myDataTable1)
     
                If cResulat1 > 0 Then 
     
    'cResultat est la variable qui me retourne la valeur du compte que je fait avec CountQuery1.ExecuteScalar
     
                    For i = 0 To myDataTable1.Rows.Count - 1
                        WaitBar.Show()
                        WaitBar.Refresh()
                        myLine = lstview.Items.Insert(0, myDataTable1.Rows(i)("DateMsg"))
                        myLine.SubItems.AddRange(New String() {myDataTable1.Rows(i)("HeureMsg").ToString, "SMS", myDataTable1.Rows(i)("FID"), myDataTable1.Rows(i)("Expediteur"), _
                       myDataTable1.Rows(i)("Destinataire"), myDataTable1.Rows(i)("Taille"), myDataTable1.Rows(i)("DLR")})
                        WaitBar.ProgressBar1.Value = i
                        Thread.Sleep(10)
                    Next i
                    WaitBar.Close()
                Else
                    MsgBox("Aucun enregistrement trouvé !", MsgBoxStyle.Information)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    les dates ne doivent pas être passé sous forme de string via concaténation mais sous forme de date via parameters
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    where datemsg >=@datedebut
     
    cmd.parameters.Add("@datedebut",variabledatedebut)
    sinon c'està mysql de convertir de string vers date, et qui sait s'il n'inverse pas le mois et le jour par rapport à ce que tu penses ...

    passer par des parameters fait que la requete marchera sur tous les paramétrages de format de date plutot qu'un seul
    pour les string ca permet d'éviter le problème des apostrophes
    d'une manière générale ca évite les injections sql, principale faille de sécurité connue
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 45
    Par défaut
    je fais des modifications et je vous fais un feedback

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 45
    Par défaut
    En faîtes j'ai fini par trouver la solution. Il me fallait formaté les dates avant des les insérer dans les requêtes

    Code vb : 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
    73
    74
    75
    76
    77
    78
    79
     
    Public jour, jour1, mois, mois1, annee, annee1 As String
        Public dateformate, dateformate1 As String
        Sub formatdate() 'Formate la date pour l'adapter au modèle de notre moteur MySQL
            jour = Form1.DtpDebut.Value.Day
            mois = Form1.DtpDebut.Value.Month
            annee = Form1.DtpDebut.Value.Year
            dateformate = annee & "/" & mois & "/" & jour
     
            jour1 = Form1.DtpFin.Value.Day
            mois1 = Form1.DtpFin.Value.Month
            annee1 = Form1.DtpFin.Value.Year
            dateformate1 = annee1 & "/" & mois1 & "/" & jour1
        End Sub
    Public Sub BD_Recherche(ByVal lstview As ListView)
            WaitBar.ProgressBar1.Minimum = 0
            Dim i As Integer
            Dim myCommand1 As New MySqlCommand
            Dim MyAdapter1 As New MySqlDataAdapter
            Dim myDataTable1 As New DataTable
            Dim strQuery1 As String
            Dim strCountQuery1 As String
            Dim cResulat1 As Integer = 0
     
            Try
     formatdate()
                If Form1.CmbExpediteur.Text = "ALL" And Form1.CmbStatut.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg >='" & Form1.DtpDebut.Text & "' and DateMsg <='" & Form1.DtpFin.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg >='" & Form1.DtpDebut.Text & "' and DateMsg <='" & Form1.DtpFin.Text & "';"
     
                ElseIf Form1.CmbExpediteur.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and DLR='" & Form1.CmbStatut.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and DLR='" & Form1.CmbStatut.Text & "';"
                ElseIf Form1.CmbStatut.Text = "ALL" Then
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and Expediteur='" & Form1.CmbExpediteur.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and Expediteur='" & Form1.CmbExpediteur.Text & "';"
                Else
                    strQuery1 = "select * from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                    & "' and Expediteur='" & Form1.CmbExpediteur.Text & "' and DLR='" & Form1.CmbStatut.Text & "';"
                    strCountQuery1 = "select count(*) from message where DateMsg <='" & Form1.DtpFin.Text & "' and DateMsg >='" & Form1.DtpDebut.Text _
                   & "' and Expediteur='" & Form1.CmbExpediteur.Text & "' and DLR='" & Form1.CmbStatut.Text & "';"
                End If
     
                myCommand1.Connection = conexion
                myCommand1.CommandText = strQuery1
                MyAdapter1.SelectCommand = myCommand1
                Dim CountQuery1 As New MySqlCommand(strCountQuery1, conexion)
                cResulat1 = CountQuery1.ExecuteScalar
                WaitBar.ProgressBar1.Maximum = cResulat1
     
                Dim myLine As ListViewItem
                Dim j As Double = 0
                MyAdapter1.Fill(myDataTable1)
     
                If cResulat1 > 0 Then 
     
    'cResultat est la variable qui me retourne la valeur du compte que je fait avec CountQuery1.ExecuteScalar
     
                    For i = 0 To myDataTable1.Rows.Count - 1
                        WaitBar.Show()
                        WaitBar.Refresh()
                        myLine = lstview.Items.Insert(0, myDataTable1.Rows(i)("DateMsg"))
                        myLine.SubItems.AddRange(New String() {myDataTable1.Rows(i)("HeureMsg").ToString, "SMS", myDataTable1.Rows(i)("FID"), myDataTable1.Rows(i)("Expediteur"), _
                       myDataTable1.Rows(i)("Destinataire"), myDataTable1.Rows(i)("Taille"), myDataTable1.Rows(i)("DLR")})
                        WaitBar.ProgressBar1.Value = i
                        Thread.Sleep(10)
                    Next i
                    WaitBar.Close()
                Else
                    MsgBox("Aucun enregistrement trouvé !", MsgBoxStyle.Information)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

    Avec un peu d'effort et de conseil on y arrive

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tu n'as donc pas compris ce que j'ai dit ...

    parce que si ton appli tu la mets sur un autre mysql un jour, et qu'il n'est pas paramétré pareil, ca va planter de partout
    car d'un pc à l'autre et d'une instance de sgbdr à l'autre, le formatage des dates peut etre différent

    la seule solution pour avoir du code propre est de passer par des parameters
    la concaténation de requête est à proscrire

    de plus une date n'est pas un string, c'est une date, à savoir un codage sur 8 octets ; c'est alors idiot de la transformer en string pour que la base de données le retransforme en date pour l'utiliser
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    je plussoie Pol63

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 45
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    tu n'as donc pas compris ce que j'ai dit ...

    parce que si ton appli tu la mets sur un autre mysql un jour, et qu'il n'est pas paramétré pareil, ca va planter de partout
    car d'un pc à l'autre et d'une instance de sgbdr à l'autre, le formatage des dates peut etre différent

    la seule solution pour avoir du code propre est de passer par des parameters
    la concaténation de requête est à proscrire

    de plus une date n'est pas un string, c'est une date, à savoir un codage sur 8 octets ; c'est alors idiot de la transformer en string pour que la base de données le retransforme en date pour l'utiliser
    j'ai bien retenu ton conseil. Mais je n'arrivai pas a faire des parametres. Donc j'ai opter pour la petite porte. Mais je serais tres ravis si tu me donne ta version parametrée.
    Cordialement

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

Discussions similaires

  1. memset, initialisation de variables.
    Par sympho dans le forum C
    Réponses: 4
    Dernier message: 31/12/2005, 21h20
  2. Réponses: 11
    Dernier message: 07/04/2005, 10h20
  3. [VB.NET] Initialiser les variables
    Par Dnx dans le forum ASP.NET
    Réponses: 8
    Dernier message: 06/04/2005, 16h22
  4. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  5. Réponses: 9
    Dernier message: 29/06/2004, 08h40

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