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 :

Transaction problem (open datareader exception)


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien en électronique
    Inscrit en
    Janvier 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien en électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 5
    Par défaut Transaction problem (open datareader exception)
    Bonjour, je souhaite insérer des données d'une table à une autre. En utilisant Transaction, j'obtiens un message d'erreur :
    ExecuteReader implique que la commande possède une transaction lorsque la connexion affectée à la commande est en attente d'une transaction locale. La propriété Transaction de la commande n'a pas été initialisée.
    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
      Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click        
            oleCon.Close()
            oleCon.Open()
            Dim strCategory As String = " SELECT Category.ID, Category.Label FROM Category WHERE Category.ID = 1 "
            Dim olecmd As New OleDbCommand(strCategory, oleCon)
            Dim trans As OleDbTransaction = oleCon.BeginTransaction
            Dim dreaderCategory As OleDbDataReader = olecmd.ExecuteReader
            Dim intID As Integer
            Dim strLabel As String = String.Empty
            While dreaderCategory.Read
                intID = dreaderCategory("ID")
                strLabel = dreaderCategory("Label")
            End While
            dreaderCategory.Close()
            Dim strCategory_2 As String = "INSERT INTO Category_2 (ID,Label) VALUES (@ID,@Label)"
            Dim olecomCategory_2 As New OleDbCommand(strCategory_2, oleCon)
            olecomCategory_2.Parameters.AddWithValue("@ID", intID)
            olecomCategory_2.Parameters.AddWithValue("@Label", strLabel)
            olecmd.Transaction = trans
            olecomCategory_2.ExecuteNonQuery()
            oleCon.Close()
     
     
            Dim strProduct As String = "SELECT Product.ID, Product.Label, Product.ID_Cat FROM Category, Product WHERE Product.ID_Cat = 1 "
            Dim intIDProduct As Integer
            Dim strLabelProduct As String
            Dim intID_CatProduct As Integer
            Dim olecmdProduct As New OleDbCommand(strProduct, oleCon)
            oleCon.Open()
            Dim dreaderProduct As OleDbDataReader = olecmdProduct.ExecuteReader
            While dreaderProduct.Read
                intIDProduct = dreaderProduct("ID")
                strLabelProduct = dreaderProduct("Label")
                intID_CatProduct = dreaderProduct("ID_Cat")
                Dim strProduct_2 As String = "INSERT INTO Product_2 (ID,Label,ID_Cat) VALUES (@ID,@Label,@ID_Cat)"
                Dim olecomProduct_2 As New OleDbCommand(strProduct_2, oleCon)
                olecomProduct_2.Parameters.AddWithValue("@ID", intIDProduct)
                olecomProduct_2.Parameters.AddWithValue("@Label", strLabelProduct)
                olecomProduct_2.Parameters.AddWithValue("@ID_Cat", intID_CatProduct)
                'olecomDetailCmd.Transaction = tran
                olecmd.Transaction = trans
                olecomProduct_2.ExecuteNonQuery()
            End While
            trans.Commit()
        End Sub

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Tu ouvres une transaction ligne 6 et la valide ligne 44.
    Mais entre temps, tu fermes la connexion et la rouvre (lignes 21 et 29).

    En plus, tu affectes des transactions à olecmd (lignes 19 et 41) mais ce ce n'est pas cette commande que tu utilises.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien en électronique
    Inscrit en
    Janvier 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien en électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 5
    Par défaut
    Merci pour la réponse. Que suggérez-vous pour corriger le code, s'il vous plaît ? Connaissez-vous des cours en ligne sur la transaction ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 503
    Par défaut
    Il faut réinitier ta transaction sur la nouvelle commande, comme tu le fais dans la 1ère partie de ton code
    donc rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trans = oleCon.BeginTransaction
    après ta ligne 29 sur laquelle tu ouvres ta connection

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Citation Envoyé par umfred Voir le message
    Il faut réinitier ta transaction sur la nouvelle commande, comme tu le fais dans la 1ère partie de ton code
    donc rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trans = oleCon.BeginTransaction
    après ta ligne 29 sur laquelle tu ouvres ta connection
    Mauvaise idée.
    Le problème de base est que la connexion a été fermée alors qu'une transaction était en cours.

    Il faut virer le oleCon.Close() de la ligne 21 et le oleCon.Open() de la ligne 29 pour utiliser la même transaction.
    Et surtout affecter trans sur les bonnes commandes au lieu de olecmd qui ne fait pas de requête.

  6. #6
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonsoir,

    Je me suis penché sur ta routine et je pense que le mieux est :
    Utiliser Using pour garantir la libération des ressources (OleDbCommand, OleDbDataReader).
    Préparer les commandes d'insertion une seule fois en dehors des boucles et réutilisation des paramètres.
    Ouvrir la connexion une seule fois et en la fermant après toutes les opérations.

    Je te propose quelque chose à adapter dans le style.
    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
     
      Try
          oleCon.Open()
          Dim trans As OleDbTransaction = oleCon.BeginTransaction()
     
          ' Transfert des données de la table Category
          Dim strCategory As String = "SELECT Category.ID, Category.Label FROM Category WHERE Category.ID = 1"
          Using olecmd As New OleDbCommand(strCategory, oleCon, trans)
              Using dreaderCategory As OleDbDataReader = olecmd.ExecuteReader()
                  If dreaderCategory.Read() Then
                      Dim intID As Integer = dreaderCategory("ID")
                      Dim strLabel As String = dreaderCategory("Label")
     
                      Dim strCategory_2 As String = "INSERT INTO Category_2 (ID, Label) VALUES (@ID, @Label)"
                      Using olecomCategory_2 As New OleDbCommand(strCategory_2, oleCon, trans)
                          olecomCategory_2.Parameters.AddWithValue("@ID", intID)
                          olecomCategory_2.Parameters.AddWithValue("@Label", strLabel)
                          olecomCategory_2.ExecuteNonQuery()
                      End Using
                  End If
              End Using
          End Using
     
          ' Transfert des données de la table Product
          Dim strProduct As String = "SELECT Product.ID, Product.Label, Product.ID_Cat FROM Product WHERE Product.ID_Cat = 1"
          Using olecmdProduct As New OleDbCommand(strProduct, oleCon, trans)
              Using dreaderProduct As OleDbDataReader = olecmdProduct.ExecuteReader()
                  Dim strProduct_2 As String = "INSERT INTO Product_2 (ID, Label, ID_Cat) VALUES (@ID, @Label, @ID_Cat)"
                  Using olecomProduct_2 As New OleDbCommand(strProduct_2, oleCon, trans)
                      While dreaderProduct.Read()
                          olecomProduct_2.Parameters.Clear()
                          olecomProduct_2.Parameters.AddWithValue("@ID", dreaderProduct("ID"))
                          olecomProduct_2.Parameters.AddWithValue("@Label", dreaderProduct("Label"))
                          olecomProduct_2.Parameters.AddWithValue("@ID_Cat", dreaderProduct("ID_Cat"))
                          olecomProduct_2.ExecuteNonQuery()
                      End While
                  End Using
              End Using
          End Using
     
          ' Commit de la transaction
          trans.Commit()
      Catch ex As Exception
          ' Rollback de la transaction en cas d'erreur
          If oleCon.State = ConnectionState.Open Then
              trans.Rollback()
          End If
          MessageBox.Show("Erreur : " & ex.Message)
      Finally
          ' Fermeture de la connexion
          If oleCon.State = ConnectionState.Open Then
              oleCon.Close()
          End If
      End Try

Discussions similaires

  1. Problème d'utilisation exception 13
    Par chr$stophe dans le forum Assembleur
    Réponses: 2
    Dernier message: 29/11/2005, 17h58
  2. Problème - Gestion des exceptions - MFC.
    Par Atomikx dans le forum MFC
    Réponses: 4
    Dernier message: 14/11/2005, 09h38
  3. [Exception]Probleme : Java.lang.Exception
    Par Nico66 dans le forum Général Java
    Réponses: 6
    Dernier message: 09/05/2005, 12h06
  4. [VB.NET] Problème avec DataReader..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/03/2005, 19h30
  5. [Eclipse 3] "Problems Opening Editor"
    Par isak dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 17/01/2005, 12h48

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