Bonjour à tous,
J’ai une base de données SQL Server 2000 d’une dizaine de tables que j’utilise dans une application .NET en C # 3.5. Elle est chargée grâce à un Dataset. Les DataTables sont « Fillée » au chargement en fonction de la sélection d’utilisateur.
Le problème ce trouve au niveau de l’insertion des données modifiées. En effet, une des DataTable se retrouve avec 7000 enregistrements modifiées (7000 row avec un RowState à ModifiedCurrent) : ce qui est normal.
Lorsque je fait un tableAdapter.Update(dataSet.MaTable) : cela prend 45 secondes ! Cela est beaucoup trop long, surtout qu’il n’y a rien de spécial sur cette table.
J’ai donc testé dans SQL Server Management Studio de faire les 7000 Update à la main :
Cela prend également 45 secondes. J’ai donc testé en faisant une transaction :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ; ..7000 fois UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ;
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 BEGIN TRANSACTION UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ; ..7000 fois UPDATE matable SET champ=xxx WHERE id=xxx ; UPDATE matable SET champ=xxx WHERE id=xxx ; COMMIT TRANSACTION
Là ça prend 1 seconde !
J’en viens à la conclusion que tableAdapter.Update(dataSet.MaTable) n’utilise pas de transaction !
Je cherche donc en C# à faire une transaction. En fouinant sur msdn et sur le net j’ai trouvé cela mais ça ne marche pas :
J’ai une TransactionException : « La transaction a déjà été validée ou interrompue de manière implicite ou explicite ».
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 using (TransactionScope scope = new TransactionScope()) { tableAdapter.Update(dataSet.MaTable) scope.Complete(); }
Je ne sais pas d’où vient le problème. J’ajoute que c’est la première fois que j’utilise les DataSet et les Transactions en C# donc je n’y connais pas grand-chose, et je m’y prends surement mal.
Donc si quelqu’un sait comment faire une transaction ou résoudre mon problème de lenteur je l’en remercie par avance !
PS : je précise que j'ai configuré MS DTC . Bien ou mal je ne sais pas :
Partager