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 :

Prendre donnée de type Double dans une colonne d'une BDD sql en recherchant par String


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut Prendre donnée de type Double dans une colonne d'une BDD sql en recherchant par String
    C'est-un-truc-de-dingue.

    Bonjour à vous tous qui entrez dans un terrain mystérieux.

    Mon problème est simple : prendre une donnée de type double en cherchant dans la BDD à partir d'une variable de type String.

    J'ai fait le code, ça devrait marcher (et je l'ai fait de deux façons complètement différentes), MAIS, lorsque je veux pour rechercher cette valeur, il me dit qu'il n'arrive pas à convertir une donnée de la table de type String en donnée de type Integer, ce qui est normal ! Là où je ne capte pas, c'est pourquoi il s’entête à vouloir convertir cette p***** de donnée alors que je ne lui demande pas ! voici le code : (et, amis puristes, vous noterez que j'ai fait ça dans les règles de l'art!)

    Code VB.NET : 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
    Private Function GetStressAllowTemperature(ByVal TempCelsius As String, ByVal ProductForm As String, ByVal Nom As String, ByVal Taille As Double) As Double
     
            Dim indiceLH As String = "c"
            Dim indiceOut As Int16 = 0
     
            Dim RequeteSQL As String = "SELECT * FROM P_ASME_SI WHERE Nom='" & Nom & "'"
            Dim dt As System.Data.DataTable
            Dim i As Integer = 0
            Dim cn As New SqlConnection
            Dim cmd As New SqlCommand
            Dim ds As New DataSet
            Dim da As SqlDataAdapter
            Dim connectionstring As String = "Data Source=SV4203******;Initial Catalog=bas****;Persist Security Info=True;User ID=*******;Password=*******"
     
            Dim Table_P_ASME_SI As System.Data.DataTable
            Dim ligne As DataRowView
            Dim ligneTrouvees() As DataRowView
            Dim criteres() As Object
     
            cn = New SqlConnection(connectionstring)
            cn.Open()
     
            cmd.Connection = cn
            cmd.CommandText = "SELECT * from P_ASME_SI"
     
            da = New SqlDataAdapter(cmd)
            da.Fill(ds, "P_ASME_SI")
     
            Table_P_ASME_SI = ds.Tables("P_ASME_SI")
     
            Table_P_ASME_SI.DefaultView.Sort = "Product_Form ASC, Nom ASC, LowHigh ASC"
            criteres = (New Object() {ProductForm, Nom, indiceLH})
     
            ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
     
            If ligneTrouvees.Length = 0 Then
                MsgBox("Il n'y a pas de valeurs pour le matériau choisi.")
            Else
                For Each ligne In ligneTrouvees
                    MsgBox("Nom : {0}", ligne("Nom"))   'il bug ici, tout à la fin !!! Texte de l'erreur mis juste après
                Next
            End If

    "La conversion de la chaîne "SB-5445" en type 'Integer' n'est pas valide." Mais pourquoi il s'obstine ? :/
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Sur quelle ligne l’erreur ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Bonjour, Sur quelle ligne l’erreur ?
    Je l'ai noté en commentaires à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each ligne In ligneTrouvees
                    MsgBox("Nom : {0}", ligne("Nom"))   'il bug ici, tout à la fin !!! Texte de l'erreur mis juste après
                Next

    J'ai réussi à outre passer le truc en appelant tout simplement pas le truc par un msgbox, sinon ça déconne... mais ça reste un mystère.
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ce qu'il ne va pas... c'est l'utilisation de ton messageBox.... ou de la construction de chaine. Le string.Concat n'est pas automatique.

    si tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MsgBox(String.Concat("Nom : {0}", ligne("Nom")))
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Ok, j'y aurai jamais pensé !
    t'es un mac twist !
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  6. #6
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Je reviens vite fait à la charge mactwist ! Un petit détail que je ne comprend pas !

    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
    ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
     
            If ligneTrouvees.Length = 0 Then
                indiceLH = "b         "
                Table_P_ASME_SI.DefaultView.Sort = "Product_Form ASC, Nom ASC, LowHigh ASC"
                criteres = (New Object() {ProductForm, Nom, indiceLH})
                ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
            End If
     
            If ligneTrouvees.Length = 0 Then
                'MsgBox("Il n'y a pas de valeurs pour le matériau choisi.")
            Else
                For Each ligne In ligneTrouvees
                    If ligne.Item(3) = "c         " Then
                        'MsgBox(String.Concat("Nom : {0}", ligne("Nom")))
                        TB_metSa.Text = ligne.Item(3)
                    End If
                    If ligne.Item(3) = "b         " Then
     
                        TB_metSa.Text = ligne.Item(3)
                    End If
                Next
            End If
     
            ' Recherche des bornes inférieure et supérieure des températures 
     
            If TempCelsius < -30 And ligne.Item(8) IsNot Nothing Then    ' ****************************************
                dStressAllowInf = 0
                dStressAllowSup = ligne.Item(8)
                dTemperatureInf = 0
                dTemperatureSup = -30
            ElseIf TempCelsius <= 40 Then
                dTemperatureInf = -30
                dTemperatureSup = 40
                If ligne.Item(8) IsNot Nothing _
                And ligne.Item(9) IsNot Nothing Then
                    dStressAllowInf = ligne.Item(8)
                    dStressAllowSup = ligne.Item(9)
                    out = 1
                Else
                    dStressAllowInf = 0
                    dStressAllowSup = 0
                End If

    Quand je met ce code il me souligne en vert le mot "ligne" à l'endroit marqué de '********** car il me dit :
    "la variable ligne est utilisée avant qu'une valeur ne lui ait été assignée. Une exception de référence null peut se produire au moment de l'exécution".

    L'ennui c'est que je définit "ligne" pourtant, (enfin je crois) et qu'il me pose pas de problème avant !
    Alors bien sûr ça n’empêche pas mon programme de marcher mais lorsque je l'arrete il me met une erreur à cet endroit... :/ c'est un truc tout bête non ?
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    A chaque fois que tu utilises/initalises la variable ligne, tu est dans un bloc If, donc même si tu est sur de passer au moins une fois dedans pour qu'elle soit initialisée, le compilateur te préviens qu'il y a un risque que cette variable ne soit pas initialisée.

    Edit rien a voir, ligne est déclarée dans ta boucle for tu n'y a donc pas accès après.
    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
    ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
     
            If ligneTrouvees.Length = 0 Then
                'MsgBox("Il n'y a pas de valeurs pour le matériau choisi.")
            Else
                For Each ligne In ligneTrouvees
                    'je vois ligne
                    If ligne.Item(3) = "c         " Then
                        'MsgBox(String.Concat("Nom : {0}", ligne("Nom")))
                        TB_metSa.Text = ligne.Item(3)
                    End If
                    If ligne.Item(3) = "b         " Then
     
                        TB_metSa.Text = ligne.Item(3)
                    End If
                    'je vois ligne ici aussi
                Next
              'je ne vois pas ligne
            End If
                'je vois ligne encore moins qu'avant
            ' Recherche des bornes inférieure et supérieure des températures 
     
            If TempCelsius < -30 And ligne.Item(8) IsNot Nothing Then    ' ****************************************
                dStressAllowInf = 0
                dStressAllowSup = ligne.Item(8)
                dTemperatureInf = 0
                dTemperatureSup = -30
            ElseIf TempCelsius <= 40 Then
                dTemperatureInf = -30
                dTemperatureSup = 40
                If ligne.Item(8) IsNot Nothing _
                And ligne.Item(9) IsNot Nothing Then
                    dStressAllowInf = ligne.Item(8)
                    dStressAllowSup = ligne.Item(9)
                    out = 1
                Else
                    dStressAllowInf = 0
                    dStressAllowSup = 0
                End If

  8. #8
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Ok chaparo, merci! j'avais compris un truc du genre

    Ce que je crains, c'est que quand j'arrete mon programme ça me met une petite erreur à cet endroit comme quoi il est pas content, mais lorsque mon programme sera en .exe il mettra aussi une petite erreur à chaque fermeture ?

    Comment résoudre le problème du coup, s'il y a une solution ?
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Où est déclarer ta variable ligne ?
    Car le ligne l.23 et le ligne l.6 ne sont pas les mêmes.
    Il faut que tu déclares une nouvelle instance sur ta ligne.
    En gros Dim ligne = new MyListItem()

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Comme l'a dit tu n'utilises pas la bonne variable...

    En fait tu peux remplacer line(8) par ligneTrouvees(8)

    Edit : Heu en fait... Line.Item(8), correspond à quoi ?

    Ton code devrait être dans le For si tu fais un traitement à chaque Line
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par Adakhum Voir le message
    (et, amis puristes, vous noterez que j'ai fait ça dans les règles de l'art!)

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            Dim RequeteSQL As String = "SELECT * FROM P_ASME_SI WHERE Nom='" & Nom & "'"
    /
    Y a que moi que ça choque ?

    Pour le reste, les réponses ont déjà été données apparemment (ou en attente de précisions).
    Kropernic

  12. #12
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Voici mes déclarations de variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim Table_P_ASME_SI As System.Data.DataTable
            Dim ligne As DataRowView
            Dim ligneTrouvees() As DataRowView
            Dim criteres() As Object

    Qu'est ce qui te choque Kropernic ? ma colonne s'appelle nom et ma variable aussi si c'est ça ^^

    en fait mactwist je ne peux remplacer ligne par ligne trouvéee car même si je les déclare toutes les deux comme datarowview vb.net me les considère comme vraiment différentes, je n'ai même pas les même propriétés et mêmes méthodes qui suivent. Par exemple si je veux avoir la valeur de ligne je fais ligne.item() et si je veux avoir la valeur de ligneTrouvees je fais ligneTrouvees.getvalue() donc bon, ça marche comme ça je laisse comme ça ... j'avais vu ça dans un bouquin vb.
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Y a que moi que ça choque ?

    Pour le reste, les réponses ont déjà été données apparemment (ou en attente de précisions).
    Je lui ai déjà fait la réflexion dans une autre discu.

    Après dans le code qu'il nous a donné il ne se sert jamais de RequeteSQL.

    Edit, On t'a déjà parlé des requêtes paramétrées. C'est une des choses les plus "importantes", enfin c'est surtout la base de ce que tu peux faire coté client pour éviter les injection SQL

    Edit 2 : Pour supprimer ton avertissement, il faut que tu fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ligne As DataRowView = new dataRowview
    Ca enlèvera ton avertissement mais à mon avis ca ne fera pas ce que tu veux.

    Il faut bien comprendre que ton ligne de ta boucle FOR EACH et ton ligne de ta sub/Function ne sont pas les mêmes

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par Adakhum Voir le message

    Qu'est ce qui te choque Kropernic ? ma colonne s'appelle nom et ma variable aussi si c'est ça ^^
    Ce qui me choque est que faire de la concaténation de string pour construire une requête SQL, je ne considère pas cela comme étant dans les règles de l'art. Il faut passer au minimum par une requête paramétrée.

    Citation Envoyé par chaparo Voir le message
    Je lui ai déjà fait la réflexion dans une autre discu.

    Après dans le code qu'il nous a donné il ne se sert jamais de RequeteSQL.

    Edit, On t'a déjà parlé des requêtes paramétrées. C'est une des choses les plus "importantes", enfin c'est surtout la base de ce que tu peux faire coté client pour éviter les injection SQL
    Je ne regarde pas toutes les discussions mais si ça a déjà été dit tant mieux. Je tape sur le clou alors ^^.

    Pour le fait qu'il ne sert pas de sa variable, c'est pas mal non plus ça. J'avais même pas fait gaffe. Après avoir vu ça, j'étais passé directement aux environs de la ligne qui provoque l'erreur.
    Kropernic

  15. #15
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Edit : Heu en fait... Line.Item(8), correspond à quoi ?
    Il correspond à la 9ème case du tableau "dataRowView" à 1 ligne de "ligne" dont j'ai besoin.

    Ce qui me choque est que faire de la concaténation de string pour construire une requête SQL, je ne considère pas cela comme étant dans les règles de l'art. Il faut passer au minimum par une requête paramétrée.
    Je ne savais pas que je faisais un truc mal en faisant ça :o Mais en effet, j'aurai dû la mettre en commentaire puisque de toute façon je ne m'en sert pas.
    Mais du coup si vous avez la patience de m'expliquer, qu'est ce que les injection SQL ? Pourquoi je dois les éviter ? merci

    Dim ligne As DataRowView = new dataRowview
    Ca enlèvera ton avertissement mais à mon avis ça ne fera pas ce que tu veux.
    Il faut bien comprendre que ton ligne de ta boucle FOR EACH et ton ligne de ta sub/Function ne sont pas les mêmes
    En effet, chaparo tu as raison, je ne comprend pas pourquoi ce ne sont pas les mêmes. Mais pour résoudre l'erreur, je vais mettre mon reste de code dans la boucle "for each" j'y avais pas pensé et c'est plus simple !


    Voici donc monde code en entier : (où il me reste un tout tout tou dernier problème..)
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    Dim cn As New SqlConnection
            Dim cmd As New SqlCommand
            Dim ds As New DataSet
            Dim da As SqlDataAdapter
            Dim connectionstring As String = "Data Source=SV42******;Initial Catalog=bas******;Persist Security Info=True;User ID=*******;Password=*********"
     
            Dim Table_P_ASME_SI As System.Data.DataTable
            Dim ligne As DataRowView
            Dim ligneTrouvees() As DataRowView
            Dim criteres() As Object
     
            cn = New SqlConnection(connectionstring)
            cn.Open()
     
            cmd.Connection = cn
            cmd.CommandText = "SELECT * from P_ASME_SI"
     
            da = New SqlDataAdapter(cmd)
            da.Fill(ds, "P_ASME_SI")
     
            Table_P_ASME_SI = ds.Tables("P_ASME_SI")
     
            Table_P_ASME_SI.DefaultView.Sort = "Product_Form ASC, Nom ASC, LowHigh ASC"
            criteres = (New Object() {ProductForm, Nom, indiceLH})
     
            ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
     
            If ligneTrouvees.Length = 0 Then
                indiceLH = "b         "
                Table_P_ASME_SI.DefaultView.Sort = "Product_Form ASC, Nom ASC, LowHigh ASC"
                criteres = (New Object() {ProductForm, Nom, indiceLH})
                ligneTrouvees = Table_P_ASME_SI.DefaultView.FindRows(criteres)
                If ligneTrouvees.Length = 0 Then
                    'MsgBox("Il n'y a pas de valeurs de contraintes admissibles pour le matériau choisi, veuillez en saisir une ou vérifier qu'elle existe.")
                Else
                End If
            End If
     
            If ligneTrouvees.Length = 0 Then
                'MsgBox("Il n'y a pas de valeurs pour le matériau choisi.")
            Else
                For Each ligne In ligneTrouvees
     
                    'ligne.Item(i) = ligneTrouvees.GetValue(i)
                    'i += 1
                    'If ligne.Item(3) = "c         " Then
                    '    'MsgBox(String.Concat("Nom : {0}", ligne("Nom")))
                    '    TB_metSa.Text = ligne.Item(3)
                    'End If
                    'If ligne.Item(3) = "b         " Then
     
                    '    TB_metSa.Text = ligne.Item(3)
                    'End If
     
                    ' Recherche des bornes inférieure et supérieure des températures 
                    If TempCelsius < -30 Then 'And ligne.Item(8) IsNot "{System.DBNull}" Then
                        dStressAllowInf = 0
                        dStressAllowSup = ligne.Item(8)
                        dTemperatureInf = 0
                        dTemperatureSup = -30
                    ElseIf TempCelsius <= 40 Then
                        dTemperatureInf = -30
                        dTemperatureSup = 40
                        If ligne.Item(8) IsNot "{System.DBNull}" And ligne.Item(9) IsNot "{System.DBNull}" Then
                            dStressAllowInf = ligne.Item(8)
                            dStressAllowSup = ligne.Item(9)
                        Else
                            dStressAllowInf = 0
                            dStressAllowSup = 0
                        End If
                    ElseIf TempCelsius <= 65 Then
                        dTemperatureInf = 40
                        dTemperatureSup = 65
                        If ligne.Item(9) IsNot "{System.DBNull}" And ligne.Item(10) IsNot "{System.DBNull}" Then
                            dStressAllowInf = ligne.Item(9)
                            dStressAllowSup = ligne.Item(10)
                        Else
                            dStressAllowInf = 0
                            dStressAllowSup = 0
                        End If
     
                    ElseIf TempCelsius <= 100 Then
                        dTemperatureInf = 65
                        dTemperatureSup = 100
                        If ligne.Item(10) IsNot "{System.DBNull}" And ligne.Item(11) IsNot "{System.DBNull}" Then
                            dStressAllowInf = ligne.Item(10)
                            dStressAllowSup = ligne.Item(11)
                        Else
                            dStressAllowInf = 0
                            dStressAllowSup = 0
                        End If
     
                    ElseIf TempCelsius <= 900 Then
                        i = 0
                        While TempCelsius <= 900 - (i * 25)
                            dTemperatureInf = 900 - ((i + 1) * 25)
                            dTemperatureSup = 900 - (i * 25)
                            i += 1
                        End While
     
                        If ligne.Item(44 - i) IsNot "DBNull" _
                        And ligne.Item(44 - i + 1) IsNot Nothing Then
                            dStressAllowInf = ligne.Item(44 - i)
                            dStressAllowSup = ligne.Item(44 - i + 1)
                        Else
                            If ligne.Item(44 - i) IsNot "{System.DBNull}" _
                        And ligne.Item(44 - i + 2) IsNot "{System.DBNull}" _
                        And TempCelsius <= 875 Then
                                dStressAllowInf = ligne.Item(44 - i)
                                dStressAllowSup = ligne.Item(44 - i + 2)
                            Else
                                If ligne.Item(44 - i - 1) IsNot "{System.DBNull}" _
                        And ligne.Item(44 - i + 1) IsNot "{System.DBNull}" _
                        And TempCelsius <= 875 Then
                                    dStressAllowInf = ligne.Item(44 - i - 1)
                                    dStressAllowSup = ligne.Item(44 - i + 1)
                                End If
                            End If
                        End If
                    End If
                Next
            End If

    En fait : Je lui dit de ne pas rentrer dans les "if" si "ligne.Item(x) IsNot "{System.DBNull}" " Mais il rentre quand même !
    Cela vient d'où me direz vous ? Et bien lorsque "ligneTrouvees" parcours ma table de ma BDD il y a parfois des trous, des blancs, donc lui il met "{System.DBNull}" dans chaque case où il n'y a rien.
    Ma question : comment je fais pour détecter qu'il n'y a rien dans cette case, enfin, qu'il y a "{System.DBNull}" ?

    J'ai beau rentrer "is nothing" "is null" is DBNull" "is nada kedal rien" il y va quand même ..
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  16. #16
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par Adakhum Voir le message
    Je ne savais pas que je faisais un truc mal en faisant ça :o Mais en effet, j'aurai dû la mettre en commentaire puisque de toute façon je ne m'en sert pas.
    Mais du coup si vous avez la patience de m'expliquer, qu'est ce que les injection SQL ? Pourquoi je dois les éviter ? merci
    Disons que tu utilises cette requête et que ta variable nom provient d'un texte écrit par l'utilisateur dans un textbox.

    Maintenant, je suis l'utilisateur et dans le textbox, j'écris un nom avec une apostrophe. Là déjà, à moins de faire ce qu'il faut pour que ce soit traité correctement, l'exécution de la requête va renvoyé une erreur car pour sql server, la chaine de caractère va s'arrêter à l'apostrophe que j'aurai ajoutée et il ne saura pas quoi faire de ce qui suit et je vais donc avoir un joli message d'erreur.

    Manque de pot pour toi, je suis développeur et je comprends le charabia technique qui m'est affiché à l'écran (qui, avec un peu de chance me rajoute encore des détails sur la structure de ta db). Du coup, car je suis un sale con (t'as vraiment pas de bol en fait ), je peux, en entrant ce qui va bien dans le textbox, envoyé mes propres requêtes vers ta DB.

    Plus d'info sur les injections ici.
    Kropernic

  17. #17
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Les requêtes paramétrées : Tuto ou Faq.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  18. #18
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    merci rv et merci kropernic (il est trop bon ce pseudo )

    ok d'accord pour ta réponse Krop! ^^ Mais je ne crois pas dans mon cas qu'il peut y avoir des injection sql du coup, l'utilisateur choisi selon un combobox un truc qui va chercher ensuite plein de chose dans la DB et tout se fait automatiquement, il n'y a pas d'autre entrées utilisateur.
    Et s'il rentre qq chose dans le combobox ça ne fait rien.


    il me reste mon pitit problème du System.DBNull (cf au dessus ... )
    Détaillez votre question et vous obtiendrez une réponse précise ! (c'est un peu magique)
    Et si vous êtes fou de voyage bienvenue ici : http://lenormanditinerant.blogspot.fr

  19. #19
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Adakhum Voir le message
    En effet, chaparo tu as raison, je ne comprend pas pourquoi ce ne sont pas les mêmes. Mais pour résoudre l'erreur, je vais mettre mon reste de code dans la boucle "for each" j'y avais pas pensé et c'est plus simple !


    En fait : Je lui dit de ne pas rentrer dans les "if" si "ligne.Item(x) IsNot "{System.DBNull}" " Mais il rentre quand même !
    Cela vient d'où me direz vous ? Et bien lorsque "ligneTrouvees" parcours ma table de ma BDD il y a parfois des trous, des blancs, donc lui il met "{System.DBNull}" dans chaque case où il n'y a rien.
    Ma question : comment je fais pour détecter qu'il n'y a rien dans cette case, enfin, qu'il y a "{System.DBNull}" ?

    J'ai beau rentrer "is nothing" "is null" is DBNull" "is nada kedal rien" il y va quand même ..
    Alors 1, la il va falloir revoir les déclarations de variable et leur porté. tu trouveras ca dans le cours de Mr Lasserre. Lorsque tu créé une boucle for each tu déclare une nouvelle variable tu es d'ailleur sencé spécifier le Type avec l'instruction AS. Cette variable ne sera disponible que dans ta boucle for, si une autre variable porte le meme nom dans ta fonction, elle ne sera plus utilisable dans ta boucle for, si elle est déclarée au niveau de ta classe tu pourras y avoir accès avec l'intruction me.maVariable.

    Ensuite pour le 2, là comme ca j'ai pas trop d'idée mais tu peux très bien et très vite regarder ce que tu as comme valeur avec le debug et les point d'arrêt(f9 sur la ligne ou tu veux t'arrêter) ensuite tu utilises les espions pour voir les valeurs présentes sur ta variable ligne.

    Edit : Tu penses qu'il ne peut pas y avoir de soucis mais à long terme ou à court ca finira par péter il suffit qu'un " ' " se glisse dans ta combo (depuis la bdd ou depuis l'utilisateur) même si c'est pas fait pour faire des dégats tu peux être sur que ca arrive.

  20. #20
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Perso, pour éviter les DBNULL et les erreurs qui vont avec, je m'arrange pour que mes requêtes ne renvoient jamais de marqueurs NULL. Après, tout est beaucoup plus simple.
    Kropernic

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/06/2015, 11h23
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  4. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  5. [2.0] Mettre une Checkbox dans le header d'une colonne d'une DatagridView
    Par aurelien.tournier dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/01/2007, 10h27

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