Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/04/2011, 16h32   #1
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Par défaut Transaction DB2 avec 2 instructions en VB.NET

Bonjour,

je développe un soft en VB.NET qui communique avec une base DB2 sur un AS400.
J'ai besoin de faire les mises à jour de 2 tables en même temps, donc je décide d'utiliser une transaction.

J'ai donc trouvé le code suivant dans la FAQ :

Code :
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
VB.NET
' Initialisation de la transaction depuis la connexion.
Dim trans As DB2Transaction = conn.BeginTransaction
 
' Création et exécution de la/des commandes à exécuter.
Dim sqlCmd AS DB2Command = conn.CreateCommand
 
' La commande est placée sous contrôle de la transaction.
sqlCmd.Transaction = trans
sqlCmd.CommandType = CommandType.Text
sqlCmd.CommandText = "INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('A','A');"
sqlCmd.CommandText += "INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('A','A');"
 
Try
	If Not (sqlCmd.ExecuteNonQuery = 0) Then
		' La transaction peut être confirmée.
		trans.Commit
	Else
		' Les opérations effectuées doivent être annulées.
		trans.Rollback
		MessageBox.Show("Erreur d'écriture dans la base de données")
	End If
Catch ex As Exception
	' Les opérations effectuées doivent être annulées.
	trans.Rollback
	MessageBox.Show("Erreur d'écriture dans la base de données: " + ex.Message)
End Try
sqlCmd.Dispose
C'est moi qui ai ajouté la ligne

Code :
sqlCmd.CommandText += "INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('A','A');"

puisque je dois faire 2 instructions dans ma transaction.

Ce que je n'arrive pas à trouver comment séparer les 2 instructions Update, j'ai essayé un peu tout, virgule, point-virgule, slash, etc. mais rien n'y fais je me trouve avec une jolie erreur qui me dit que le UPDATE suivant est inattendu, et que l'on attend un <FIN-D'INSTRUCTION>

Sauriez-vous m'éclaierer sur le sujet ?

Merci
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 18h53   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Tu ne peux traiter ou exécuter les instructions SQL qu'une par une, comme je le montre ci-dessous :

Code :
1
2
3
4
5
6
sqlCmd.CommandText = "INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('A','A');"
 
Try
	IF NOT (sqlCmd.ExecuteNonQuery = 0) Then
          ...
End Try
puis

Code :
1
2
3
4
5
6
sqlCmd.CommandText = "INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('B','B');"
 
Try
	IF NOT (sqlCmd.ExecuteNonQuery = 0) Then
           ...
End Try
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 08h29   #3
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Merci pour ta réponse, je vais faire des tests pour voir si en faisant un rollback après 2 commandes comme ça les 2 sont annulées ou non.
Je le trouve quand même assez primitif ce DB2 =/

Bon ba génial la table ne semble pas accepter les transactions car elle n'est pas journalisée ou je ne sais quoi ...
Pour le moment j'ai mis un super retry dans mon code si la seconde instruction ne se déroule pas correctement, mais si quelqu'un a une solution ça m'arrange.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 10h21   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par asmduty Voir le message
Merci pour ta réponse, je vais faire des tests pour voir si en faisant un rollback après 2 commandes comme ça les 2 sont annulées ou non.
Tant que tu ne ferme pas ta transaction ca devrait le faire.


Citation:
Je le trouve quand même assez primitif ce DB2 =/
euh

C'est plutôt que tu ne connais pas les limites / possibilité de tes drivers.

Recherche du côté du batch jdbc pour exécuter plusieurs statement d'un coup (insert en particulier).

En java avec le driver JT400 ca fonctionne.

Citation:
Bon ba génial la table ne semble pas accepter les transactions car elle n'est pas journalisée ou je ne sais quoi ...
C'est normal, c'est la journalisation qui permet de travailler en un autre mode que commit *NONE.

Ca permet de pouvoir annuler tes ordres sql (rollback)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 12h59   #5
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Tu peux journaliser tes tables en lançant la commande OS/400 :
Code :
STRJRNPF FILE(MaBib/MaTable1 MaBib/MaTable2 MaBib/MaTable3 ...) JRN(MaBib/MonJrn) IMAGES(*BOTH)
MAIS il faut avoir au préalable créé dans l'ordre :
  • le récepteur de journal
  • le journal lui-même

Code :
CRTJRNRCV JRNRCV(MaBib/MonRcv)  ...
Code :
CRTJRN JRN(MaBib/MonJrn) JRNRCV(MaBib/MonRcv)  ...



A l'attention du webmestre :
Je trouve que la séquence ajoutée sur chaque ligne de code pollue le code et induit le lecteur en erreur. C'était plus clair et plus propre auparavant sans cette séquence qui me paraît bien inutile.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 13h08   #6
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
Je vous remercie de vos 2 réponses.
Quand je dis que DB2 semble primitif c'est que j'ai aussi quelques fonction SQL stqndard qui n'existent pas en DB2, ou dans la version que j'utilise plutôt.
Je pense qu'ils sont loin d'être à jour dans leur version.

Je ne vais probablement pas pouvoir journaliser mes tables sachant que l dans l'une j'ai un enregistrement entrant toutes les 10 secondes, et de ce que l'on me dit la journalisation prend de la place et du temps.
Je vais les laisser devant le choix entre l'intégrité des données ou le temps/l'espace utilisé

Je marque come résolu et je viendrai reposter si finalement je journalise.
Mercie encore
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 19h29   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par asmduty Voir le message
Je vous remercie de vos 2 réponses.
Quand je dis que DB2 semble primitif c'est que j'ai aussi quelques fonction SQL stqndard qui n'existent pas en DB2, ou dans la version que j'utilise plutôt.
Je pense qu'ils sont loin d'être à jour dans leur version.
Et pourtant db2 est assez à jour par rapport aux normes sql.

Peut-être pourrai-tu poser tes fonctions qui posent problèmes afin que des personnes plus expérimentée avec db2 puissent te donner une solution / ré-écriture ?

Citation:
Je ne vais probablement pas pouvoir journaliser mes tables sachant que l dans l'une j'ai un enregistrement entrant toutes les 10 secondes, et de ce que l'on me dit la journalisation prend de la place et du temps.
Je vais les laisser devant le choix entre l'intégrité des données ou le temps/l'espace utilisé

Je marque come résolu et je viendrai reposter si finalement je journalise.
Mercie encore
Concernant la place : tu peux customiser la taille de tes recepteurs et les supprimer quand bon te semble des qu'ils sont détachés. Donc si ton problème n'est qu'une question de place, je doute que prévoir 1-2go de disque pour pouvoir faire tourner tes journaux soient un réel problème ...

Concernant le temps perdu : sérieux une insertion toute les 10sec c'est rien du tout.

Tu n'as pas une bonne approche du problème selon moi.

Il faut plutôt voir avec ces axes là :
- criticité des données
- intégrité de la base quand ton sql / code plante (lock, bug, etc)
- type de traitement (batch / intéractif / ..)
- volume (attention en Mo / Go) traité.

Avant que la journalisation te pénalise (temps de réponse) sur des traitements tu as le temps vu ce que tu nous présente.

Si ta base est destinée à être utilisée par une application tierce je penses qu'il ne faut même pas se poser la question => journalisation + gestion des transaction par cette même application.

Ca te donnera beaucoup plus de souplesse & possibilité pendant les devs et tu n'auras pas besoin de faire des reprises de données des qu'un bug apparait
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 18h15   #8
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 821
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 42
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 821
Points : 1 041
Points : 1 041
Citation:
Envoyé par Mercure Voir le message
Tu ne peux traiter ou exécuter les instructions SQL qu'une par une
On peux faire plusieurs insert de valeurs en simultané :

Code :
1
2
3
 
 
INSERT INTO db2admin.Test2 (nom, prenom) VALUES ('A','A'), ('B','B'), ('C','C')
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 20h35   #9
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Citation:
Envoyé par K2R400
On peux faire plusieurs insert de valeurs en simultané
J'ignorais cette possibilité, mais cela ne dépend-t-il pas de la version de l'OS ?


On en apprend tous les jours...
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 22h24   #10
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 821
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 42
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 821
Points : 1 041
Points : 1 041
Citation:
Envoyé par Mercure Voir le message
J'ignorais cette possibilité, mais cela ne dépend-t-il pas de la version de l'OS ?
Forcément, mais je ne me rappelle plus la version :-(
Mais de mémoire ce n'est pas jeune.
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h14.


 
 
 
 
Partenaires

Hébergement Web