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 :

Une connexion existante a dû être fermée par l’hôte distant


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut Une connexion existante a dû être fermée par l’hôte distant
    Bonjour à tous,

    Décidément je collection les soucis de connexion en ce moment.

    Je ne comprend pas cette erreur, j'ai tous essayé mais rien ne change.

    Voici ma fonction source d'erreur :

    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
      Public Function listerTest(Optional ByVal id As Integer = Nothing) As ArrayList Implements ImyService.listerTest
            Dim cxString As String = "Data Source=JEROME-PC\SQLEXPRESS;Initial Catalog=MonAlbum;Integrated Security=True"
            Dim Connexion As SqlConnection
            Connexion = New SqlConnection
            Connexion.ConnectionString = cxString
            Dim query As String
            Dim tab As New ArrayList
            Try
     
                Connexion.Open()
                If id <> Nothing Then
                    query = " SELECT * FROM  image WHERE id = " & id
                Else
                    query = "SELECT * FROM image"
                End If
     
                Dim commande As SqlCommand = New SqlCommand(query, Connexion)
                Dim images As New ArrayList
     
                Dim myreader As SqlDataReader = commande.ExecuteReader
     
                'Propriété de la classe image ( Transtypage )
                Dim CG As String
                Dim CM As String
                Dim Titre As String
                Dim idUser As Integer
                Dim idNiveau As Integer
     
                While myreader.Read
                    CG = myreader.GetString(1)
                    CM = myreader.GetString(2)
                    Titre = myreader.GetString(3)
                    idUser = CType(myreader(4), Integer)
                    idNiveau = CType(myreader(5), Integer)
                    Dim img As New MonAlbumLibrairie.Image(CG, CM, Titre, idUser, idNiveau)
                    tab.Add(img)
                End While
     
                Return tab
                myreader.Close()
                Connexion.Close()
            Catch ex As SqlException
                tab.Add(ex.Message)
                Return tab
            End Try
     
        End Function
    Merci par avance pour votre aide

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    sql server en cas de problème peut fermer la connexion, mais normalement c'est plus que rare

    ca te fais ca systématiquement ?

    sinon concernant le code, la même chose en 10 lignes de moins :
    (moins il y a de code, plus c'est lisible et maintenable, enfin ce n'est pas toujours vrai, mais le plus souvent)
    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
    Public Function listerTest(Optional ByVal id As Integer = -1) As ArrayList Implements ImyService.listerTest
            Try
                Dim cxString As String = "Data Source=JEROME-PC\SQLEXPRESS;Initial Catalog=MonAlbum;Integrated Security=True"
     
                Using Connexion As New SqlConnection(cxString)
     
                    Dim query As String = "SELECT * FROM image"
                    Dim tab As New ArrayList
     
                    If id <> -1 Then query &= " WHERE id = " & id
     
                    Dim commande As New SqlCommand(query, Connexion)
                    Dim images As New ArrayList ' variable inutile ?
     
                    Connexion.Open()
     
                    Dim myreader As SqlDataReader = commande.ExecuteReader
     
                    While myreader.Read
                        Dim CG As String = myreader.GetString(1)
                        Dim CM As String = myreader.GetString(2)
                        Dim Titre As String = myreader.GetString(3)
                        Dim idUser As Integer = CType(myreader(4), Integer)
                        Dim idNiveau As Integer = CType(myreader(5), Integer)
                        Dim img As New MonAlbumLibrairie.Image(CG, CM, Titre, idUser, idNiveau)
                        tab.Add(img)
                    End While
     
                    myreader.Close()
                    Return tab() ' après return, plus rien n'est exécuté, donc mettre du code derrière ce n'est pas une super idée :D
                End Using
     
            Catch ex As SqlException
                TAB.Add(ex.Message)
                Return TAB()
            End Try
        End Function
    un integer ne peut valoir nothing, certes on peut l'écrire, mais un integer mis à nothing vaudra 0
    sachant qu'un id est rarement négatif (rarement égal à 0 aussi certes ^^) avec -1 je trouve ca plus propre ^^

    using / end using sert pour les variables qui ont la méthode Dispose, Dispose libère la mémoire utilisée par la variable
    ca garantie que la méthode dispose sera appelée dans tous les cas, s'il y une erreur dans du code .net, ca ne continue pas l'exécution du code, ca va dans le catch
    or si tu fermes la connexion avant le catch ca ne passera donc pas dessus, avec using même dans ce cas dispose est appelé, sur une connexion dispose appelle la méthode close qui ferme la connexion
    (en plus ta fermeture de connexion était après Return, donc jamais exécutée car au niveau du return ca sort directement !)

    la requête il vaut mieux nommer les colonnes plutot que de faire un select *
    si tu relis ton code dans 6 mois je te garantie que tu ne te rappelleras pas que contient cette table
    au niveau de la récupération des données avec le reader là aussi il faut nommer ce qu'on fait, et seul la propriété item permet de nommer ce qu'on veut récupérer (getstring, getint32 et autres ne le permettent pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim titre as string = myreader.item("telle colonne").tostring
    dim idUser as integer = cint(myreader.item("telle colonne"))
    dans le cas d'un select *, si tu rajoutes une colonne au milieu, tu ne seras obligé de modifier les numéros des colonnes dans le code
    dans le cas où tu rajoutes une colonne de retour dans la requête, tu ne seras pas obligé de la mettre à la fin, et sur une récupération de beaucoup de colonnes myreader(29) ca devient illisible

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Je ne saurai expliqué d’où venais mon erreur, mais une chose de sur, c'est que grâce a toi, Pol63 le problème de ma connexion est résolu.

    Merci également pour le petit topo sur le Using, je ne connaissais pas.

    Même ce livre n'en parle pas : http://www.amazon.fr/Visual-Basic-20...4428687&sr=1-3

    Mais maintenant le soucis est a l’appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Dim myImage As New MonAlbumLibrairie.Image
            For Each myImage In myservice.listerTest(1)
                          Me.literal_photo.Text += myImage.titre
            Next
    Il me dit impossible d’effectué un cast de type system.string en type MonAlbumLibrairie.Image

    Je comprend pas. Il faut bien que j'utilise ma classe Image ?

    Sinon comment lui passer dans le For each les paramètre que je souhaite afficher ?

    Pour moi POO + BD =

    Merci pour votre aide

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    le using quand on le connais pas on le découvre généralement quand on a des problèmes de mémoire du style OutOfMemoryException, et qu'on se penche sur la gestion de la mémoire

    sur ta 1ère ligne le new n'est pas utile, vu que derrière tu mets autre chose dedans, il faut bien comprendre la différence entre déclaration et instanciation

    quand tu as une erreur le message ne suffit pas, il nous faudrait le type d'exception et surtout la ligne qui passe en erreur, dans le 1er post ce n'était pas forcément important, et dans celui là il y a un cas qui est flagrant, et peut etre d'autres possibles
    le flagrant, c'est que si tu passes dans le catch, tu ajoutes un string dans ton arraylist, celui ci n'était pas typé tu peux y mélanger des image et des strings
    mais dans le for each, arrivé sur le string il voit bien que ce n'est pas un image

    += c'est pour additionner, pour concaténer c'est le & qui est utilisé en vb.net, soit &=

    sinon tu peux remplacer l'arraylist par un list(of MonAlbumLibrairie.Image) y compris sur le retour de la fonction, le list(of ) est plus utilisé car typé
    par contre tu ne pourras y mettre de string dedans, il va te signaler avant compilation que ce n'est pas possible
    le comportement plus fréquent en cas d'erreur, plutot que d'afficher un morceau de la collection et une erreur, c'est de ne rien afficher du tout et de prévenir l'utilisateur que ca a planté
    pour ca, dans le catch tu mets juste throw, et dans l'appelant tu mets un try catch avec un message

    sur le for each tu peux aussi regagner une ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for each myimage as MonAlbumLibrairie.Image in myservice.listerTest
    [...]

    je viens de voir le (1) au bout de la ligne, non repris sur ma ligne de code cu dessus car je ne vois pas ce qu'il vient faire là
    si tu veux parcourir un tableau tu ne dis pas de parcourir l'element à l'index 1 du tableau
    de plus parcourir un élément d'un tableau, ci celui n'est pas un tableau ca n'a pas de sens

    tout comme écrire for each personne in [le salon] est plus logique que for each personne in [telle personne], à moins de tomber sur une personne schizophrène ou une femme enceinte bien sur ...

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut


    Un GRAND, un IMMENSE MERCI Pol63 pour ton aide si précieuse.

    Grâce à toi, tout fonctionne

    Voila pourquoi j'adore la programmation :

    Des heures ( euh que dis-je des jours ) a chercher, a éplucher les article, a se renseigner, discuter et aux final avoir ce sentiment de victoire et de bonheurs quand le code marche enfin ! J'adore

    +1000000 pour toi Pol63

    Juste une petite question : c'est normale que dans un Web Service je ne peut passer des paramètre optionnel ?

    [EDIT] Je me répond tous seul est publie la solution pour qui ça peut intéresser :

    Il faut simplement dans l'appel de la fonction déclarer un Nullable ( of ...)

    En l'occurence pour moi ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Dim i As Nullable(Of Integer) = -1
            Dim myImage = myservice.listerTest(i)
            For Each item In myImage
                Me.literal_photo.Text &= "<h2>" & item.titre & "</h2>"
                Me.literal_photo.Text &= "<img src = " & item.cheminGrande & " >"
            Next

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    les paramètres optionnels ne sont pas totalement intégrés à .net
    ils existent en vb.net mais pas encore en c#
    donc ca ne m'étonnerait pas qu'un webservice n'en veule pas

    nullable(of ) est une classe tout à fait standard donc pratique pour ca ...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    les paramètres optionnels ne sont pas totalement intégrés à .net
    ils existent en vb.net mais pas encore en c#
    Si, ils existent en C# 4

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/05/2013, 10h28
  2. Réponses: 2
    Dernier message: 13/03/2009, 22h24
  3. Réponses: 0
    Dernier message: 04/02/2009, 16h48
  4. Réponses: 3
    Dernier message: 09/11/2007, 14h08
  5. Réponses: 1
    Dernier message: 08/02/2006, 21h31

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