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

Windows Forms Discussion :

[vb.net] transaction sql server


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 30
    Par défaut [vb.net] transaction sql server
    bonjour bonjour !

    j'essaie de mettre en place une transaction... comme ceci :

    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
    Dim oConnection As SqlClient.SqlConnection
    Dim i As Integer
    		Try
    			oConnection.ConnectionString = oString
    			oConnection.Open()
    			For i = 0 To 2
                    'initilisation transaction
                    Dim Transac As SqlClient.SqlTransaction = oConnection.BeginTransaction
                    'creation commandes à éxécuter
                    Dim SQLTransac As SqlClient.SqlCommand = oConnection.CreateCommand
                    'commandes contrôlées par la transaction.
                    oCommand.Transaction = Transac
                    oCommand.CommandType = CommandType.Text
                    If i = 1 Then
                        oCommand.CommandText = "INSERT INTO test values"
                    Else
                        oCommand.CommandText = "INSERT INTO test(test_id) values (" & i & ")"
                    End If
                    Try
                        If Not (oCommand.ExecuteNonQuery = 0) Then
                            'enregistrement
                            Transac.Commit()
                        Else
                            'erreur annulation
                            Transac.Rollback()
                            MessageBox.Show("Erreur d'écriture dans la base de données")
                        End If
                    Catch ex As Exception
                        'annulation
                        Transac.Rollback()
                        MessageBox.Show("Erreur d'écriture dans la base de données: " + ex.Message)
                    End Try
                Next
                oCommand.Dispose()
                oConnection.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    j'ai mis volontairement une condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If i = 1 Then
                        oCommand.CommandText = "INSERT INTO test values"
                    Else
                        oCommand.CommandText = "INSERT INTO test(test_id) values (" & i & ")"
                    End If
    pour faire planter une de mes requêtes et vérifier que ça annule bien les premières requêtes qui se sont éxecutées, mais ça n'annule rien du tout

    une erreur dons mon code ?! :o merci !

  2. #2
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Pour que toutes les commandes soient annulees il faut creer la transaction a l'exterieur de la boucle. Dans ton cas tu as 3 transactions

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 30
    Par défaut
    bonsoir Piotrek !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Transac As SqlClient.SqlTransaction = oConnection.BeginTransaction
                    'creation commandes à éxécuter
                    Dim SQLTransac As SqlClient.SqlCommand = oConnection.CreateCommand
                    'commandes contrôlées par la transaction.
                    oCommand.Transaction = Transac
    j'ai passé tout ceci au dessus du For mais ça ne fonctionne tujours pas...
    Exception : SqlTransaction est terminé, il n'est plus utilisable. c'est l'erreur renvoyé.

    J'en ai mis trop en dehors ? je sais plus trop quoi essayé !

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu n'as pas mis la partie Commit/Rollback hors de ton for non plus je suppose. Au premier passage dans ta boucle la transaction est "validée" (commit ou rollback), résultat, au second passage et bien la transaction n'est plus viable puisque le coup d'avant elle a été "validée".

    A une transaction doit correspondre une et une seule opération commit ou rollback, sachant qu'il ne faut pas imbriquer les transactions

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 30
    Par défaut
    salut !

    bah j'ai oublié quelque chose alors ...

    comment mes requêtes s'éxécute là si c'est le commit qui éxécute... je vois pas là.. je bloque !

    si je mets mon commit à l'extérieur de la boucle, je n'ai qu'une seule requête qui s'éxécute d'ailleurs c'est logique ça pour moi mais le reste non

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par iamunknown
    comment mes requêtes s'éxécute là si c'est le commit qui éxécute... je vois pas là.. je bloque !
    Lors d'une transaction le "résultat" du lot de requêtes, car une transaction peut englober plusieurs requêtes, est stocké de manière temporaire. Par la suite, lorsque tu fais un commit les résultats sont validés et stockés de manière définitive, si tu fais un rollback on ne touche à rien.

    Donc, lors d'une transaction :

    1- tu ouvres la transaction
    2- tu effectues ton lot de requêtes
    3- tu valides (commit) ou annules (rollback), si tu as des erreurs, la transaction, une et une seule fois, à la fin de l'exécution du lot

    Maintenant, les transactions programmées sont peut être un peu différentes de celles en script SQL, mais je pense que le principe doit être le même

  7. #7
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    A quoi sert ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oCommand.CommandText = "INSERT INTO test values"
    :

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    C'est pour introduire une erreur et vérifier l'annulation de la transaction, dixit son premier post

    Mais bon, faire un rollback tout court à la fin aurait été suffisant pour vérifier la chose ^^

  9. #9
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut Re: [vb.net] transaction sql server
    ok mal lu de ma part excuses

    Je verrai les choses plutôt ainsi alors
    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
     
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    '...
     
     Const badInsert As String = "INSERT INTO test values"
     Const insert As String = "INSERT INTO test(test_id) values(?)"
     
     Dim oConnection As SqlConnection = Nothing
     Dim SQLTransac As SqlCommand = Nothing
     Dim Transac As SqlTransaction  = Nothing
     Dim i As Integer
     
     Try
       oConnection =New SqlConnection(oString)
       oConnection.Open()
     
       Transac = oConnection.BeginTransaction()
       SQLTransac = oConnection.CreateCommand()
       SQLTransac.Connection = oConnection
       SQLTransac.Transaction = Transac
     
       For i=0 to 2
         If i = 1 Then: SQLTransac.CommandText = badInsert
         Else : SQLTransac.CommandText = insert.Replace("?", i.ToString())
         End If
         SQLTransac.ExecuteNonQuery()
       Next
       Transac.Commit()
     Catch e As Exception
       Try
          Transac.Rollback()
       Catch ex As SqlException
          MessageBox.Show(ex.Message)
       End Try
       MessageBox.Show(e.Message)
     Finally
       If Not(oConnection Is Nothing) _ 
         AndAlso Not(oConnection.State = ConnectionState.Closed) Then
             oConnection.Close()
       End If
     End Try

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 30
    Par défaut
    bonjour !

    merci pour votre aide, j'ai adapté tout ce que vous avez dit à mon cas et ça fonctionne très bien !
    merci encore !

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

Discussions similaires

  1. [ADO.Net] Connexion à SQL SERVER 2005
    Par dumser1 dans le forum Accès aux données
    Réponses: 9
    Dernier message: 17/01/2009, 17h37
  2. [VB.NET] connexion à Sql server 2005 via script vb
    Par grandslam dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/06/2006, 11h13
  3. [VB.NET 2005][SQL SERVER 2005] Pb d'insertion en BdD
    Par jhary07 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/01/2006, 08h53
  4. [VB.net] Connection SQL server
    Par WriteLN dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/08/2005, 17h39
  5. Réduction du Journal de transactions SQL Server
    Par Aki dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/10/2004, 09h15

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