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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 197
    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 197
    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 197
    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 197
    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?

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