Accès sql serveur 2008 ou fichier sdf 3.5 avec la même application vb.net
-
mercredi 1 février 2012 16:53
Bonjour,
Je souhaite qu'occasionnellement, un utilisateur puisse partir avec l'ensemble des données le concernant (données sur sql serveur 2008) et travailler chez lui sur une base sql mobile 3.5, puis rapatrier ses sonnées à son retour.
J'ai créé toute la partie réplication/fusion qui fonctionne bien. J'ai 2 projets d'accès aux données : 1 projet DataSQL avec fichier edmx basé sur sql serveur 2008 et une entité SQLEntities, et 1 projet DataSDF avec fichier edmx basé sur sql mobile 3.5 et une entité SDFEntities.
Dans un 3ème projet, j'ai des forms qui accèdent aux données. Dans les forms j'ai à chaque fois une définition de contexte en variable globale
Imports DataSQL
Private aContext As New SQLEntities
Et dans des sub j'ai des lignes du type
Table1_bindingSource.DataSource = (From p In aContext.Table1 Selectp)
ou encoreaContext.SaveChanges()
Si manuellement je change
Imports DataSQL par Imports DataSDF
et
Private aContext As New SQLEntities par Private aContext As New SDFEntities
ça fonctionne et je modifie les données de la base mobile.
Problème : comment au lancement de mon application choisir de travailler sur la base SQL serveur ou sur la base SQL Mobile ? Et quelle(s) expressions faut-il mettre dans chaque forms pour qu’il se branche sur le bon contexte ?
Merci beaucoup.
Toutes les réponses
-
lundi 6 février 2012 09:48Propriétaire
Bonjour,
Les classes SQLEntities et SDFEntities sont dérivées d’Object Context, donc vous pouvez utiliser la class générale
Private aContext As ObjectContext
et puis selon une variable (peut-être stockée dans le fichier de configuration de votre application) vous décidez comment initialiser la variable :
If (Sql) Then aContext = New SQLEntities Else aContext = New SDFEntities End IfBien sûr que dans ce cas il faut inclure aussi :
Imports DataSQL
Imports DataSDF
Imports
System.Data.Objects
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian DuduialaOwner mercredi 8 février 2012 07:16
-
lundi 13 février 2012 11:27
Bonjour et merci Ciprian,
D'accord sur ce point, mais lorsque je fais un
myBindingsource.DataSource = From p In aContext.MaTable Select p
J'ai le message 'MaTable' n'est pas membre de 'system.data.object.objectContext'. Mon souci est à ce niveau en fait, je n'ai pas accès aux tables définies dans le schéma d'origine puisque je suis dans une classe plus générale. Ou du moins je ne sais pas comment faire...
Laumon.
- Modifié laumon lundi 13 février 2012 11:27
-
mardi 14 février 2012 09:08Propriétaire
Bonjour,
Oui, vous avez raison. En plus, il n’y a pas une méthode directe et plus simple que celle que vous utilisez maintenant avec la solution que je vous ai proposée. Désole pour vous mettre sur une fausse piste !
Vu que le provider SQL de SQL CE est SQL Server sont différentes, il n’est pas possible d’utiliser un seul modèle et seulement changer la chaine de connexion. De toute façon, il existe une solution pour utiliser un modèle Entity Framework avec plusieurs providers. L’article indiqué discute l’exemple VistaDB Northwind.
Pour simplifier les choses, je vous recommande d’utiliser le modèle SDF dans votre application et, après parcourir toutes les étapes décrites dans l’article, il suffit d’instancier l’objet aContext du type SDFEntities avec le constructeur par défaut ou en utilisant la chaine de connexion pour la base des données SQL (selon vos besoins).
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse laumon mardi 14 février 2012 11:30
-
mardi 14 février 2012 11:30
Bonjour,
J'avais trouvé ça, mais partant d'une base répliquée, je n'ai pas pris ce chemin, finalement je ne répliquerai pas toutes les tables de la base.
J'ai donc opté pour une solution qui conserve 2 fichier edmx et une constante au niveau du projet (Global_BASE). Je compile 2 exe en fonction de la valeur de Global_Base (SDF ou SQL). Et pour chaque appel d'entité je met le code suivant
#If Global_BASE = "SQL" Then
Imports AsaDataSql
#Else
Imports AsaDataSdf
#End If
#If Global_BASE = "SQL" Then
Private aContext As New SQLEntities
#Else
Private aContext As New SDFEntities
#End IfVoila.
Merci encore.
Laumon.
- Marqué comme réponse laumon mardi 14 février 2012 11:30

