Linq to sql

Résolu
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008 - 2 oct. 2008 à 17:24
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 7 oct. 2008 à 17:50
Bonjour,
J'ai des problèmes avec l'utilisation de linq to sql.
J'ai deux applications "A" et "B" qui peuvent modifier et lire des données d'un table de ma base de donnée (sql server 2005). C'est en fait les même applications.
Le resultat des requetes linq me renvoit un résultat différent de celui de la base de donnée... je m'esplique...
En fait lorsque mon application "A" modifie des valeurs dans la base de donnée, la base de donnée est modifiée est les bonnes valeurs apparaissent pour "A" mais l'application "B" ne les "voit" pas. J'ai beau refaire des select, regarder dans le debugger  Par contre les valeurs de la table dans la base de donnée sont modifiées.
Inversement si je modifie à partir de l'application "B" , "B" voit les changements mais pas "A".

par la suite j'ai trouvé une méthode du datacontext : .refresh(refreshmode.overwritecurrentvalues,"ma table")
alléluia ca fonctionnait  quand "A" modifiait la base de donnée, "B" le voyait.

sauf que ce refresh dégrade complètement les performances de mon application

avez vous une idée pour passer outre cette méthode refresh ou autre?

SeeD2018
ps : quand j'utilisais des fonctions de la classe 'system.data.sqlclient' ca fonctionnait bien, sauf que je dois passer à linq

10 réponses

SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
6 oct. 2008 à 12:03
Après plusieur test, j'ai trouve une solution
L'exemple1 foire, même avec un ToList, un .ToArray
L'exemple 2 est bon pourquoi je ne sais pas...

Exemple1:

For
Each b
As LBanque
In (
From ligneE
In L.BanqueGet
Select ligneE)MsgBox(b.Libelle)

NextExemple 2:

For
Each b
As LBanqueEntite
In (
From ligneE
In L.BanqueGet
Select
New LBanqueEntite(ligneE.Id, ligneE.Libelle))MsgBox(b.Libelle)

Next

SeeD2018
3
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
2 oct. 2008 à 18:16
Bon,

En Fait, il faut oublier le problème ci dessus....c'est la requete linq en vert qui donne ce comportement,

Return (From ligneA In TabIdEAbo Join ligneE In L.EntiteGetByConfigE(ConfigE) On ligneA Equals ligneE.Id _

 Order By ligneE.Nom, ligneE.Prenom _

'Select New EntitePourLV(ligneE.Id, ligneE.Nom, ligneE.Prenom, ligneE.DateF)).ToArray

ca c'est la correction qui fonctionne.

Return (
From ligneE
In L.EntiteGetByConfigE(ConfigE)
Where TabIdEAbo.Contains(ligneE.Id) _

Order
By ligneE.Nom, ligneE.Prenom _

Select
New EntitePourLV(ligneE.Id, ligneE.Nom, ligneE.Prenom, ligneE.DateF)).ToArray

why?

SeeD2018
0
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
2 oct. 2008 à 19:15
en fait , j'ai des problemes avec d'autre requete linq comme

banque est une table dans le LinqClass
"select ligne from banque"

cette requete ne me renvoit pas les bonnes valeurs , elles sont bonne juste au démarrage de mon appli....

SeeD2018
0
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
3 oct. 2008 à 11:44
Dans le premier cas, c'est le code de la requete qui n'etait pas bon.
Dans le second cas, ca ne vient pas du code de la requete mais d'autre chose, jene sais pas quoi

SeeD2018
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
3 oct. 2008 à 16:42
Salut,
Pour ta 1ère question: Lorsque on modifie une BDD, les changements ne sont pas directement appliqué à la BDD, mais seulement gardé en mémoire locale.
Pour appliquer les changements à la BDD, il faut appeler la méthode SubmitChanges du DataContexte, cela permet d'uploader les changements pour mettre la BDD à jours.
Clair que tu vas perdre en performance, l'utilisation d'une base de données n'est pas destiné à faire du partage de données entre applications locales, et il s'agit d'un traitement sur un fichier, pas seulement dans la mémoire comme lorsque on utilise une List(Of ...) par exemple.
0
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
3 oct. 2008 à 16:54
Merci pour ta réponse,
J'utilise déjà un submitchange des qu'il ya une modification de la base de donnée,
et ca modifie la base de donnée.Ce que j'essaye d'espliquer c'est que malheureusement ca ne fonctionne que dans l'application en cours et pas dans les autres. comme si linq ne lisait en lecture que les objet en mémoire sans interroger la BDD.

SeeD2018
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
3 oct. 2008 à 17:47
La base de données est donc bien mise à jours avec un SubmitChange à  partir de l'application A, et pourtant les changements ne sont pas visible si tu réinterroge la base de données depuis l'application B?

Effectivement, étrange, mais je suis dans le même cas que toi, aucune idée pourquoi cela se produit...
Ce qui m'étonne surtout, c'est qu'avec LINQ la base de données n'est pas téléchargé localement au début, mais seulement les données utiles lorsque tu utilise les données, donc dans ton exemple lors du .ToArray.
0
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
4 oct. 2008 à 10:47
quelqu'un a une idée

SeeD2018
0
SeeD2018 Messages postés 16 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 6 octobre 2008
6 oct. 2008 à 12:06
Comme je n'arrive pas à modifier un de mes commentaires dans ce forum, j'ajoute un com.
J'ai oublié de vous mettre la classe LbanqueEntite
Public

Class LBanqueEntite

            Inherits LBanque

            Public
Sub
New(
ByVal _Id
As
Integer,
ByVal _Libelle
As
String)
               Id = _Id
               Libelle = _Libelle

            End
Sub

End
ClassAvez vous une esplication?

SeeD2018
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
7 oct. 2008 à 17:50
Beu, c'est drôle ça... je ne comprend pas non plus.
Par contre, tu n'est pas obligé de créer ta classe LBanqueEntite
, tu peux faire comme ceci:

For Each b In (From ligneE In L.BanqueGet Select New With {ligneE.Id, ligneE.Libelle})
0
Rejoignez-nous