IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Relier 2 tables grâce à une table tierce [Débutant]


Sujet :

ASP.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Relier 2 tables grâce à une table tierce
    Bonjour,

    Je débute en ASP.NET avec VWD 2010 Express et SQL Server 2008 R2 Express.
    Je crée une application sous forme de site web (en c#) pour la gestion des contacts de mon entreprise.

    Mon problème :
    Je souhaite rattacher les données d'une table (Contacts) à l'une ou l'autre de 2 autres tables (Prestataires, Clients).

    En clair, je voudrais qu'il soit possible de créer un simple contact (id_contact, nom_contact, prenom_contact, tel_contact) et relier celui-ci à un prestataire (id_prestataire, nom_prestataire, adresse_prestataire, etc...) et/ou un client (id_client, nom_client, adresse_client, etc...)

    Début de solution :
    J'ai donc créé 5 tables dont voici le schéma :


    Lorsque je renseigne manuellement les champs des tables ContactsPrestataires et ContactsClients (exemple : id_contact = 1, id_prestataire = 1), aucun problème, le lien est fait et je peux afficher mes données dans un control GridView (dans l'exemple, mon contact 1 est bien relié à mon prestataire 1).

    Cependant, je n'arrive pas à créer un formulaire (FormView) me permettant d'incrémenter mes tables ContactsPrestataires et ContactsClients...

    J'avais pensé au début à créer une clé étrangère dans les tables Prestataires et Clients mais j'ai vite compris la limite de cette configuration lorsque j'ai voulu créer un 2e contact pour le même client ou le même prestataire. Qui plus est, un prestataire peut être client et vice-versa, d'où ma volonté créer une table établissant les liens entre mes différentes tables.

    J'espère avoir été assez clair, n'hésitez pas à me demander des précisions, et merci d'avance pour votre aide.

    Cordialement,

    Japeth

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 18
    Points
    18
    Par défaut
    Tu pourrais essayer avec ce schéma, ainsi que cette logique d'ajout.
    c.f. voir pièce jointe
    Images attachées Images attachées  

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci mickeyhitek pour ton aide !

    Ton schéma de table ressemble de très près au mien, sauf que tu as à priori 2 clés primaires dans les tables PrestataireContact et ClientContact (j'aimerais savoir comment tu fais ça !)

    Par contre je n'ai pas tout à fait compris ta "logique d'ajout" (entre le contact et les différentes adresses je suppose), pourrais-tu développer pour m'expliquer comment rentrer les données dans mes 2 tables ?

    Merci d'avance,

    Japeth

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Japeth Voir le message
    Ton schéma de table ressemble de très près au mien, sauf que tu as à priori 2 clés primaires dans les tables PrestataireContact et ClientContact (j'aimerais savoir comment tu fais ça !)
    Voici deux versions (courte - moins précise, et longue - plus complète, avec les noms précis donnés aux contraintes de clés).

    Il s'agit d'une création de table d'association, avec une clé primaire composite, ainsi que des références aux clés étrangères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE ClientContact
    (
        Client_Id int references Customers(Id) not null,
        Contact_Id int references Products(Id) not null,
        Primary key (Client_Id, Contact_Id)
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TABLE ClientContact(
    	Client_Id int not null,
    	Contact_Id int not null,
    	CONSTRAINT PK_ClientContact PRIMARY KEY NONCLUSTERED
    		( Client_Id ASC, Contact_Id ASC )
    )
     
    ALTER TABLE ClientContact ADD CONSTRAINT FK_ClientContact_Client FOREIGN KEY(Client_Id)
    REFERENCES ClientSet(Id)
    GO
     
    ALTER TABLE ClientContact ADD CONSTRAINT FK_ClientContact_Contact FOREIGN KEY(Contact_Id)
    REFERENCES ContactSet(Id)
    GO
    Citation Envoyé par Japeth Voir le message
    Par contre je n'ai pas tout à fait compris ta "logique d'ajout" (entre le contact et les différentes adresses je suppose), pourrais-tu développer pour m'expliquer comment rentrer les données dans mes 2 tables ?
    Pour moi, la logique d'ajout ici est la manière dont tu gère l'association entre deux entités (car c'est une association many-to-many). Est-ce que tu proposes à la création d'un Client la saisie d'une liste de Contacts. Ou bien à la création d'un Contact la saisie d'une liste de Clients. Ou encore les deux schémas sont proposés ?!

    cf. http://www.developpez.net/forums/d12...r/#post6589508

    Ainsi, si je propose une liste de Contacts à choisir à la création d'un Client (et seulement ceci pour gérer cette association), je procède comme suit au niveau BDD:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SqlCommand command = new SqlCommand(
                    "INSERT INTO ClientSet (Name) VALUES('Emily')",
                    conn);
    command.CommandType = CommandType.Text;
    command.ExecuteNonQuery();
     
    command = new SqlCommand(
                    "INSERT INTO ClientContact (Client_Id, Contact_Id) VALUES(5, 6)", 
                    conn);
    command.CommandType = CommandType.Text;
    command.ExecuteNonQuery();
    J'espère me faire comprendre

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Mickeyhitek, tout d'abord un grand merci à toi pour ton aide.
    Après plusieurs essais infructueux, j'ai enfin trouvé une solution à mon problème à l'aide d'une procédure stockée.

    N'étant pas un grand expert en la matière, je pense avoir un peu "bidouiller" mais voici ma solution (d'un projet de test simplifié) :

    Shéma de ma table :


    Relations : (J'ai spécifié des règles de mises à jour et de suppression en cascade pour mes 2 relations afin de supprimer les données de ma table ContactsPrestataires lorsque qu'un contact ou un prestataire est supprimé de ma base de données)


    Code de ma procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ALTER PROCEDURE dbo.NewContact
     @nom_Contact nvarchar(50),
     @Prenom_Contact nvarchar(50),
     @id_Prest int
    AS
     Begin
     
      Set Nocount On
     
      DECLARE @id_Contact int
     
      INSERT INTO [Contacts]
      ([nom_Contact], [Prenom_Contact]) 
      VALUES (@nom_Contact, @Prenom_Contact)
     
      SELECT @id_Contact=@@IDENTITY
     
      INSERT INTO [ContactsPrestataires]
      ([id_Prest], [id_Contact])
      VALUES (@id_Prest, @id_Contact)
     
     End
    Code de mon formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource2" 
        DefaultMode="Insert" DataKeyNames="nom_Contact,Prenom_Contact" 
            oniteminserted="ValiderInsertion">
            <InsertItemTemplate>
                nom_Contact:
                <asp:TextBox ID="nom_ContactTextBox" runat="server" 
                    Text='<%# Bind("nom_Contact") %>' />
                <br />
                Prenom_Contact:
                <asp:TextBox ID="Prenom_ContactTextBox" runat="server" 
                    Text='<%# Bind("Prenom_Contact") %>' />
                <br />
                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
                    CommandName="Insert" Text="Insérer" />
                &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                    CausesValidation="False" CommandName="Cancel" Text="Annuler" />
            </InsertItemTemplate>
        </asp:FormView>
    Code de ma connexion à la base de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
            ConnectionString="<%$ ConnectionStrings:csTest %>" InsertCommand="NewContact" 
            InsertCommandType="StoredProcedure" 
        SelectCommand="SELECT Contacts.nom_Contact, Contacts.Prenom_Contact FROM ContactsPrestataires INNER JOIN Contacts ON ContactsPrestataires.id_Contact = Contacts.id WHERE (ContactsPrestataires.id_Prest = @id_Prest)">
        <SelectParameters>
     
            <asp:ControlParameter ControlID="DetailsView1" Name="id_Prest"  // Récupération des infos du Control DetailsView
                PropertyName="SelectedValue" Type="Int32" />
     
        </SelectParameters>
            <InsertParameters>
                <asp:Parameter Name="nom_Contact" Type="String" />
                <asp:Parameter Name="Prenom_Contact" Type="String" />
     
                <asp:QueryStringParameter Name="id_Prest" QueryStringField="ID" Type="Int32" />  // Incrémentation automatique de l'id Prestataire (selectionné au préalable)
     
             </InsertParameters>
        </asp:SqlDataSource>
    Voilà, je ne sais pas si c'est très "propre" mais cela fonctionne parfaitement.
    J'espère que cette explication pourra en aider certains.

    Encore merci à mickeyhitek, je n'hésiterais pas à revenir poster ici lorsque je serais bloqué

    @+,

    Japeth

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Incrémenter un champ d'une table grâce à une requête?
    Par Swore dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 20/12/2011, 17h52
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  4. Réponses: 2
    Dernier message: 17/04/2009, 12h13
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo