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 :

datareader associé ouvert


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    génie logiciel
    Inscrit en
    Mars 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : génie logiciel

    Informations forums :
    Inscription : Mars 2012
    Messages : 113
    Points : 21
    Points
    21
    Par défaut datareader associé ouvert
    bonjour,
    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
    con.ConnectionString = "Data Source=MEHDI-PC\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=eco"
            d = CDate(MaskedTextBox1.Text)
            con.Open()
            cmd = New SqlCommand("select N_CPT_POS from COMPTEURS;", con)
            da = cmd.ExecuteReader
            While da.Read
                If da(0) = Val(TextBox13.Text) Then
                    MsgBox("Un compteur avec le même numéro existe déja!", MsgBoxStyle.Critical)
                    da.Close()
                Else
                    Try
                        com = New SqlCommand("insert into COMPTEURS(N_ORD_ECO,SOUS_QUART,CIL,QUART,NOM_CLT,AV_ACC,PORTE,RUE,N_CPT_DEPO,N_SERIE,DER_IND_LU,TP_CAL,MAR_DEPO,N_CPT_POS,IND_DEPO,DATE_DEPO,CAL_POS,MAR_POS) values('" & ComboBox1.SelectedItem.ToString & "','" & TextBox1.Text & "','" & Val(TextBox2.Text) & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "','" & Val(TextBox6.Text) & "','" & TextBox7.Text & "','" & Val(TextBox8.Text) & "','" & Val(TextBox9.Text) & "','" & Val(TextBox10.Text) & "','" & Val(TextBox11.Text) & "','" & TextBox12.Text & "','" & Val(TextBox13.Text) & "','" & Val(TextBox14.Text) & "','" & d & "','" & Val(TextBox16.Text) & "','" & TextBox17.Text & "''" & RichTextBox1.Text & "');", con)
                        com.ExecuteNonQuery()
                        MsgBox("Compteur ajouté avec succés", MsgBoxStyle.OkOnly)
                    Catch ex As Exception
                        MsgBox("Erreur d'insertion des données:" & ex.ToString)
                    End Try
                End If
            End While
            con.Close()
    lorsque j'insère une donnée qui n'existe pas le message d'erreur que j'ai est:
    un datareader associé à cette commande est déjà ouvert et doit être ferme

  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    L'objet DataReader utilise l'objet Connection en mode exclusif. Si l' objet DataReader est toujours ouvert, tu ne peux réutiliser ta connexion.

    Ici ta connexion (con) est exclusive à ton DataReader (da), tu dois fermer ton reader avant de faire ton insertion.

    Tu peux passer par un booléen, si tu as un compteur avec un numéro existant, tu passes ton booléen à True, tu sors de la boucle, tu fermes ton DataReader, et avant ton insertion tu testes que ton booléen ne soit pas à true.

    Je ne m'explique pas très bien alors parfois du code explique mieux ...

    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
     
            Dim existe As Boolean = False
            con.ConnectionString = "Data Source=MEHDI-PC\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=eco"
            d = CDate(MaskedTextBox1.Text)
            con.Open()
            cmd = New SqlCommand("select N_CPT_POS from COMPTEURS;", con)
            da = cmd.ExecuteReader
            While da.Read Or Not existe
                If da(0) = Val(TextBox13.Text) Then
                    MsgBox("Un compteur avec le même numéro existe déja!", MsgBoxStyle.Critical)
                    existe = True
                End If
            End While
     
            da.Close()
     
            If Not existe Then
                Try
                    com = New SqlCommand("insert into COMPTEURS(N_ORD_ECO,SOUS_QUART,CIL,QUART,NOM_CLT,AV_ACC,PORTE,RUE,N_CPT_DEPO,N_SERIE,DER_IND_LU,TP_CAL,MAR_DEPO,N_CPT_POS,IND_DEPO,DATE_DEPO,CAL_POS,MAR_POS) values('" & ComboBox1.SelectedItem.ToString & "','" & TextBox1.Text & "','" & Val(TextBox2.Text) & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "','" & Val(TextBox6.Text) & "','" & TextBox7.Text & "','" & Val(TextBox8.Text) & "','" & Val(TextBox9.Text) & "','" & Val(TextBox10.Text) & "','" & Val(TextBox11.Text) & "','" & TextBox12.Text & "','" & Val(TextBox13.Text) & "','" & Val(TextBox14.Text) & "','" & d & "','" & Val(TextBox16.Text) & "','" & TextBox17.Text & "''" & RichTextBox1.Text & "');", con)
                    com.ExecuteNonQuery()
                    MsgBox("Compteur ajouté avec succés", MsgBoxStyle.OkOnly)
                Catch ex As Exception
                    MsgBox("Erreur d'insertion des données:" & ex.ToString)
                End Try
     
            End If
     
            con.Close()
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #3
    Membre à l'essai
    Homme Profil pro
    génie logiciel
    Inscrit en
    Mars 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : génie logiciel

    Informations forums :
    Inscription : Mars 2012
    Messages : 113
    Points : 21
    Points
    21
    Par défaut
    j ai l'erreur suivante:
    Tentative non valide de lecture lorsque aucune donnée n'est présente.
    sur la ligne if da(0)=textbox13.text.
    merci

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    La solution d'_Ez3kiel est correcte, mais je voudrais juste ajouter qu'il ne faut pas hésiter à utiliser le mot clef USING, qui permet de libérer complètement l'objet. Du coup, plus besoin de se soucier de la fermeture des connexions par exemple, c'est fait automatiquement (si l'objet implémente IDisposable).

    Dans ton cas, ça donnera quelque chose comme ceci :
    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
    Dim existe As Boolean = False
    Using con = new SqlConnection("Data Source=MEHDI-PC\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=eco")
        d = CDate(MaskedTextBox1.Text)
        con.Open()
        Using cmd = New SqlCommand("select N_CPT_POS from COMPTEURS;", con)
            Using (da = cmd.ExecuteReader)
                While da.Read Or Not existe
                    If da(0) = Val(TextBox13.Text) Then
                        MsgBox("Un compteur avec le même numéro existe déja!", MsgBoxStyle.Critical)
                        existe = True
                    End If
                End While
            End Using
        End Using
        If Not existe Then
            Try
                Using com = New SqlCommand("insert into COMPTEURS(N_ORD_ECO,SOUS_QUART,CIL,QUART,NOM_CLT,AV_ACC,PORTE,RUE,N_CPT_DEPO,N_SERIE,DER_IND_LU,TP_CAL,MAR_DEPO,N_CPT_POS,IND_DEPO,DATE_DEPO,CAL_POS,MAR_POS) values('" & ComboBox1.SelectedItem.ToString & "','" & TextBox1.Text & "','" & Val(TextBox2.Text) & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & TextBox5.Text & "','" & Val(TextBox6.Text) & "','" & TextBox7.Text & "','" & Val(TextBox8.Text) & "','" & Val(TextBox9.Text) & "','" & Val(TextBox10.Text) & "','" & Val(TextBox11.Text) & "','" & TextBox12.Text & "','" & Val(TextBox13.Text) & "','" & Val(TextBox14.Text) & "','" & d & "','" & Val(TextBox16.Text) & "','" & TextBox17.Text & "''" & RichTextBox1.Text & "');", con)
     
                    com.ExecuteNonQuery()
                    MsgBox("Compteur ajouté avec succés", MsgBoxStyle.OkOnly)
     
                End Using
            Catch ex As Exception
                MsgBox("Erreur d'insertion des données:" & ex.ToString)
            End Try
        End If
    End Using
    (Je ne sais pas si les objets com et cmd sont déjà déclarés plus haut, donc il y a peut-être quelques ajustements à faire)

    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre à l'essai
    Homme Profil pro
    génie logiciel
    Inscrit en
    Mars 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : génie logiciel

    Informations forums :
    Inscription : Mars 2012
    Messages : 113
    Points : 21
    Points
    21
    Par défaut
    Merci j ai résolu le problème.
    Enfait il fallait que je j'enlève or not existe.

  6. #6
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    j ai l'erreur suivante:
    Tentative non valide de lecture lorsque aucune donnée n'est présente.
    sur la ligne if da(0)=textbox13.text.
    merci
    A première vue, et sans vouloir te vexer, vérifie que ta table contient des données ...
    N'oublie pas de toujours tester tes readers avant de les parcourir.
    .read() retourne un booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            If da.read Then
                While da.read
     
                End While
            Else
                MsgBox("Aucunes données recupérées")
            End If

    @DotNetMatt, bon à savoir, merci.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2010, 16h34
  2. Réponses: 6
    Dernier message: 31/12/2009, 09h08
  3. Réponses: 2
    Dernier message: 07/11/2009, 11h56
  4. Problème DATAREADER déjà ouvert
    Par poufouille dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/12/2007, 08h27
  5. Réponses: 3
    Dernier message: 27/02/2007, 14h04

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