none
Accès sql serveur 2008 ou fichier sdf 3.5 avec la même application vb.net RRS feed

  • Question

  •  

        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 encore

    aContext.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.

    mercredi 1 février 2012 16:53

Réponses

  • 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 If
    

     

     

    Bien sûr que dans ce cas il faut inclure aussi :

     

    Imports DataSQL

    Imports DataSDF

    Imports

    System.Data.Objects

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    lundi 6 février 2012 09:48
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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 09:08
  •    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 If

    Voila.

    Merci encore.

    Laumon.

    • Marqué comme réponse laumon mardi 14 février 2012 11:30
    mardi 14 février 2012 11:30

Toutes les réponses

  • 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 If
    

     

     

    Bien sûr que dans ce cas il faut inclure aussi :

     

    Imports DataSQL

    Imports DataSDF

    Imports

    System.Data.Objects

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    lundi 6 février 2012 09:48
  •  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
    lundi 13 février 2012 11:27
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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 09:08
  •    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 If

    Voila.

    Merci encore.

    Laumon.

    • Marqué comme réponse laumon mardi 14 février 2012 11:30
    mardi 14 février 2012 11:30