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 :

Problème vb.net sqlExpress 2005


Sujet :

VB.NET

  1. #1
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut Problème vb.net sqlExpress 2005
    Bonjour à tous,
    Je developpe actuellement un serveur telnet pour des lecteurs de codebar mobiles. Le système permet une gestion d'inventaire et prend des informations dans un base de données Acomba et gère l'inventaire sur une base de données SqlExpress 2005. le serveur est multithread (Asynchrone) et le nombre d'utilisateurs simultanés se limite a 2 pour l'instant .

    Tout fonctionne bien pendant des heures puis soudainement une erreur apparait:
    Une erreur s'est produite 09-02-09 17:52:18):

    ERREUR: System.Data.SqlClient.SqlCommand
    ###Un DataReader associé à cette commande est déjà ouvert. Il doit d'abord être fermé.
    ### à System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
    à System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
    à System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
    à System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    à System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
    à System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
    à System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
    à System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
    à ConsoleTcpServeur.BdTerminal.getCommandeSql(String p_noCommande)
    À partir de ce moment plus aucune commande sql ne fonctionne et chacune me retourne des erreur totalement impossible par exemple :
    Une erreur s'est produite 09-02-09 17:52:18):

    ERREUR: System.Data.SqlClient.SqlCommand
    ###La colonne 'idCommande' n'appartient pas à la table .
    ### à System.Data.DataRow.GetDataColumn(String columnName)
    à System.Data.DataRow.get_Item(String columnName)
    à ConsoleTcpServeur.BdTerminal.getCommandeSql(String p_noCommande)
    Ces erreurs proviennent d'un fichier log ou j'inscrit les message et stackTrace des exceptions. Le serveur est codé en vb.net 3.5.

    A L'AIDE!

  2. #2
    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 : 43
    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
    Par défaut
    Un DataReader associé à cette commande est déjà ouvert. Il doit d'abord être fermé.
    Ca me semble assez clair... si tu as un SqlDataReader ouvert pour lire les résultats d'une SqlCommand, tu dois le fermer avant de pouvoir exécuter de nouveau cette SqlCommand

    Et si tu nous montre pas ton code, on pourra pas t'en dire beaucoup plus

  3. #3
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Je n'utilise explicitement aucun datareader, voici du code
    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
     
    Private strChaineConnexion As String = String.Empty
    Private builder As New SqlConnectionStringBuilder
    Private Shared laConnexion As SqlConnection = Nothing
    Public Event erreurSql(ByVal erreur As String)
    Public Event warningSql(ByVal warning As String)
     
    Public Function getCommandeSql(ByVal p_noCommande As String) As Commande
            Dim cmd As Commande = Nothing
            Dim noCommande As String = p_noCommande
            Dim dtCommande As New DataTable
     
            If Not verifierConnexion() Then
                RaiseEvent erreurSql("Impossible de trouver la commande: erreur de connexion au serveur SQL")
                Return Nothing
                Exit Function
            End If
     
            Dim daCommande As New SqlDataAdapter("SELECT * FROM commande WHERE noCommande = @noCommande", laConnexion)
     
            daCommande.SelectCommand.Parameters.AddWithValue("@noCommande", DbType.String).Value = noCommande
     
            Try
                daCommande.Fill(dtCommande)
                If dtCommande.Rows.Count > 0 Then
                    cmd = New Commande
                    cmd.idCommande = dtCommande.Rows(0).Item("idCommande")
                    cmd.noCommande = dtCommande.Rows(0).Item("noCommande")
                    cmd.statutCommande = dtCommande.Rows(0).Item("statutCommande")
                    cmd.idUsager = dtCommande.Rows(0).Item("idUsager")
                    cmd.dateTimeStamp = dtCommande.Rows(0).Item("dateTimeStamp")
                End If
            Catch ex As Exception
                RaiseEvent erreurSql("ERREUR: " & daCommande.SelectCommand.ToString & ControlChars.CrLf & "###" & _
                                     ex.Message & ControlChars.CrLf & "###" & ex.StackTrace)
            Finally
                daCommande.Dispose()
                laConnexion.Close()
            End Try
     
            Return cmd
        End Function
     
     Private Function connexion() As Boolean
            Dim isOk As Boolean = True
            builder("User id") = "******"
            builder("password") = "******"
            builder("database") = "*******"
            builder("server") = My.Settings.NomServeurSql
            strChaineConnexion = builder.ConnectionString
     
            If laConnexion Is Nothing Then
                laConnexion = New SqlConnection(strChaineConnexion)
                Try
                    laConnexion.Open()
                Catch ex As Exception
                    RaiseEvent erreurSql("ERREUR FATALE: ouverture de la connection;" & strChaineConnexion & _
                                         ControlChars.CrLf & "###" & ex.Message & ControlChars.CrLf _
                                         & "###" & ex.StackTrace)
                    isOk = False
                End Try
            End If
            Return isOk
        End Function
     
        Private Function verifierConnexion() As Boolean
            Dim isOk As Boolean = True
     
            If laConnexion IsNot Nothing Then
                If laConnexion.State <> ConnectionState.Open Then
                    Try
                        laConnexion.Open()
                    Catch ex As Exception
                        RaiseEvent erreurSql("Impossible d'ouvrir la connexion avec le serveur SQL" & _
                                             ControlChars.CrLf & "###" & ex.Message & ControlChars.CrLf _
                                             & "###" & ex.StackTrace)
                        isOk = False
                    End Try
                End If
            Else
                If Not connexion() Then
                    RaiseEvent erreurSql("Connexion inexistante")
                    isOk = False
                End If
            End If
            Return isOk
        End Function
    Comme vous voyez je n'utilise pas de datareader directement.

  4. #4
    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
    si tu fait du multithreading, chaque reader doit avoir son command et sa connexion

    et meme sans multithreading, il ne faut garder connexion ouverte pour rien
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    le tcpListener instancie une classe connexion cliente par connexion, la classe connexion cliente instancie la classe qui contient les méthodes pour les requêtes SQL.
    Je n'ai jamais eu ce genre d'erreur chez moi lors du développoment seulement chez le client et après plusieurs heures de travail sans problèmes

    Ma classe Sql compte 1733 lignes, ça en fait beaucoup à montrer.

  6. #6
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    si tu fait du multithreading, chaque reader doit avoir son command et sa connexion

    et meme sans multithreading, il ne faut garder connexion ouverte pour rien
    Est-ce que le fait d'utiliser une connexion shared peut causer ceci, même si je la ferme à chaque fois

  7. #7
    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
    oui

    un objet connexion ne peut faire qu'une chose à la fois

    si à sur un thread tu as un reader qui est en train de receptionner des données, un autre sqlcommand plantera sur la meme connexion


    la chaine de connexion par contre tu peux la mettre shared

    les choses ne se passent peut pas à la meme vitesse, et donc il peut arriver qu'à un moment 2 threads veulent accéder aux données


    tu peux instancier plusieurs dizaines d'sqlconnexion sans soucis, peut etre meme dans la meme seconde ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    oui

    un objet connexion ne peut faire qu'une chose à la fois

    si à sur un thread tu as un reader qui est en train de receptionner des données, un autre sqlcommand plantera sur la meme connexion


    la chaine de connexion par contre tu peux la mettre shared

    les choses ne se passent peut pas à la meme vitesse, et donc il peut arriver qu'à un moment 2 threads veulent accéder aux données


    tu peux instancier plusieurs dizaines d'sqlconnexion sans soucis, peut etre meme dans la meme seconde ...
    Merci sperot51,
    Donc si j'utilise une variable locale pour la connection dans chaque méthode, j'éviterai ce problème?

  9. #9
    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
    pour info, le forum as une balise code pour la mise en forme

    pour info aussi, les dataset et autre dataAdapter passent par un datareader pour obtenir les données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim c as new sqlconnexion
    à chaque fois oui
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Je sais qu'un dataAdapter utilise un datareader mais on ne peut pas l'accéder pour le fermer. Je suis à modifier mes méthodes comme suit:
    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
    Public Function majStatutItem(ByVal p_item As Iteme) As Integer
            Dim unItem As Iteme = p_item
            Dim nbModifie As Integer = 0
            Dim newDateTimeStamp As DateTime = Now
            Dim laConnexion As New SqlConnection(strChaineConnexion)
            Try
                laConnexion.Open()
            Catch ex As Exception
                RaiseEvent erreurSql("ERREUR: impossible d'ouvrir une connexion au serveur sql" & ControlChars.CrLf & "###" & _
                                     ex.Message & ControlChars.CrLf & "###" & ex.StackTrace)
                Return 0
                Exit Function
            End Try
     
            Dim cmdMaj As New SqlCommand(" UPDATE Item SET statutItem = @statutItem, dateTimeStamp = @newStamp WHERE " & _
                                         " idItem = @idItem AND dateTimeStamp = @dateTimeStamp ", laConnexion)
     
            With cmdMaj.Parameters
                .AddWithValue("@statutItem", DbType.Int16).Value = unItem.statutItem
                .AddWithValue("@idItem", DbType.Int64).Value = unItem.IdItem
                .AddWithValue("@dateTimeStamp", DbType.DateTime).Value = unItem.dateTimeStamp
                .AddWithValue("@newStamp", DbType.DateTime).Value = newDateTimeStamp
            End With
     
            Try
                nbModifie = cmdMaj.ExecuteNonQuery
                unItem.dateTimeStamp = newDateTimeStamp
            Catch ex As Exception
                RaiseEvent erreurSql("ERREUR: " & cmdMaj.CommandText & ControlChars.CrLf & "###" & _
                                     ex.Message & ControlChars.CrLf & "###" & ex.StackTrace)
            Finally
                cmdMaj.Dispose()
                laConnexion.Close()
                laConnexion.Dispose()
            End Try
     
            Return nbModifie
        End Function
    Qu'en pensez vous?
    Hé oui balise de code, décidément une journée instructive...

  11. #11
    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
    Citation Envoyé par piecot Voir le message
    Je sais qu'un dataAdapter utilise un datareader mais on ne peut pas l'accéder pour le fermer.
    certes mais le message est générique et indique que la connexion ne peut pas etre utilisées car un reader est ouvert dessus
    donc soit le fermer soit avoir une autre connexion, et dans ton cas une autre connexion


    ton code a l'air pas mal

    y a un truc qui peut etre utile aussi, c'est using, pour les objets disposables, il revient au meme qu'un try finally, à savoir en sortant du bloc using, la variable est disposée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    using v as new VariableDisposable
      ' utilisation de v
    end using
    ici v est disposé même sur une sortie en erreur pendant le bloc intérieur du using

    m'enfin avoir 50 usings imbriqués reste moins joli que les dipose dans le finally comme tu fais



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                Return 0
                Exit Function
    alors ca c'est pas trop utile, normalement le compilateur devrait te le dire, mais exit function ne sera pas exécuté, car return 0 implique que la valeur de retour est 0 et que ca sort de la function

    pour info un exit function fait que la valeur retournée est la valeur contenu dans la variable du meme nom que la function (variable crée implicitement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function test as string
        test = "machin"
        exit function
    end function
    équivaut donc à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function test as string
        return "machin"
    end function
    mais aussi à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function test as string
        dim variable as string = "machin"
        return variable
    end function

    utiliser la variable implicite peut etre pratique dans les petites fonctions avec des ValueType
    mais pour des objets et sur des grandes fonctions ca peut preter à confusion
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut
    Merci sperot51, je ne savais pas pour le exit function. En fait je ne suis qu'un junior qui se retrouve avec un gros problème sur les bras car son patron refuse de l'aider (ou ne sait pas) . Une chance qu'il y a ce forum.

  13. #13
    Membre averti
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Par défaut bloc using
    Dans un bloc using comment fait-on pour catcher les exceptions?

  14. #14
    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 : 43
    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
    Par défaut
    Citation Envoyé par piecot Voir le message
    Dans un bloc using comment fait-on pour catcher les exceptions?
    comme n'importe où ailleurs... avec un try/catch

  15. #15
    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 try catch sont imbriquables sans soucis)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/06/2007, 13h23
  2. Problème connexion sql server 2005 avec asp.net en C#
    Par PKO06 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/05/2007, 18h46
  3. [VB.NET][FW 2005] Données persistantes
    Par ekinox17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/02/2006, 12h56
  4. SQLExpress 2005 & C# : Débutant
    Par albedo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/01/2006, 17h29
  5. Problème Indy avec Delphi 2005.
    Par Bjarne93 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 29/11/2005, 19h03

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