Linq to sql [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008
-
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
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

Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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.
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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.
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

quelqu'un a une idée

SeeD2018
Messages postés
16
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
6 octobre 2008

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
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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})