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

Bases de données Delphi Discussion :

Sql server 2008 + delphi +ado


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2013
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2013
    Messages : 212
    Points : 81
    Points
    81
    Par défaut Sql server 2008 + delphi +ado
    Bonjour ;
    Je suis entrain de programmer une application Delphi7 avec Sql server 2008 , et j'utilise les composants Ado .
    Depuis longtemps je suis habitué de manipuler les données d'une façon classique :
    (adotable.insert;adotable.edit;adotable.delete......etc)
    Aprés des recherches ils m'ont dit que la meilleur façon c'est Ado query :
    (ado query.sql.add('insert into.....etc ), pour une table normale pas de problème .
    Donc le problème que j'ai , c'est comment traiter ces derniers opérations dans (maitre/détail)
    insertion,modification,suppression , es ce que traiter chaque table séparément ou traiter les deux table en meme temps .
    j'ai bien cherché et j'ai rien trouvé .

  2. #2
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2013
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2013
    Messages : 212
    Points : 81
    Points
    81
    Par défaut Insérer données à travers Ado +Delphi+Sql server 2008
    Malheureusement , j'ai posé ce sujet plusieurs fois sans aucune réponse claire:
    Avec une base de données(nom de la base: DATA) sql server 2008 , j'ai Deux tables :
    1-Maitre:etudiant(Matricule,Nom , Prénom,date_naiss).
    2-Détail:Note(Matière,Matricule_etudiant,Moyen_G).
    Mon problème:
    Je suis habitué sans problème d'insérer les données ou modifier ou supprimer avec les composants ADo Delphi,Mais en utilisant ADo table.
    Ma recherche maintenant concerne le composant ADoQuery , en utilisant des requete SQl comme ceci Adoquery1.sql.add(' insert into........);
    Donc Comment faire en Maitre/Détail????????????
    Insertion,Modification,suppression

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par heart100 Voir le message
    Malheureusement , j'ai posé ce sujet plusieurs fois sans aucune réponse claire:
    Avec une base de données(nom de la base: DATA) sql server 2008 , j'ai Deux tables :
    1-Maitre:etudiant(Matricule,Nom , Prénom,date_naiss).
    2-Détail:Note(Matière,Matricule_etudiant,Moyen_G).
    Mon problème:
    Je suis habitué sans problème d'insérer les données ou modifier ou supprimer avec les composants ADo Delphi,Mais en utilisant ADo table.
    Ma recherche maintenant concerne le composant ADoQuery , en utilisant des requete SQl comme ceci Adoquery1.sql.add(' insert into........);
    Donc Comment faire en Maitre/Détail????????????
    Insertion,Modification,suppression
    Deux solutions :
    • En code client Delphi, successivement par deux composants ADOquery
    • En code Transact SQL par implémentation d'une vue dotée d'un déclencheur INSTEAD OF UPDATE, INSERT



    Exemple pour ce dernier point :

    Les tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE etudiant
    (Matricule          INT IDENTITY PRIMARY KEY,
     Nom                VARCHAR(32) NOT NULL, 
     Prenom             VARCHAR(25),
     date_naiss         DATE);
    GO
     
    CREATE TABLE Note
    (Matiere            VARCHAR(16) NOT NULL , 
     Matricule          INT NOT NULL REFERENCES etudiant (Matricule) 
                                     ON DELETE CASCADE,
     PRIMARY KEY (Matiere, Matricule),
     Note               DECIMAL(4,2) NOT NULL);
    GO
    La vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE VIEW dbo.V_etudiant_note
    AS
    SELECT e.Matricule, Nom, Prenom, date_naiss, Matiere, Note
    FROM   dbo.etudiant AS e
           LEFT OUTER JOIN dbo.Note AS n
    	        ON e.Matricule = n.Matricule;
    GO
    Le déclencheur INSERT / UPDATE :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    CREATE TRIGGER E_I_IU_etudiant_note
    ON dbo.V_etudiant_note
    INSTEAD OF INSERT, UPDATE
    AS
    --SET NOCOUNT ON;
    -- variable locale du déclencheur
    DECLARE @Matricule INT, @Nom VARCHAR(32), @Prenom VARCHAR(25), @date_naiss DATE, @Matiere VARCHAR(16), @Note DECIMAL(4,2);
    -- curseur pour lire les INSERT / UPDATE sur la vue
    DECLARE C CURSOR 
       LOCAL   
       FORWARD_ONLY
       STATIC
       READ_ONLY
    FOR 
       SELECT Matricule, Nom, Prenom, date_naiss, Matiere, Note
       FROM   inserted;
    -- ouverture du curseur
    OPEN C;
    -- lecture de la première ligne dans le curceur
    FETCH C INTO @Matricule, @Nom, @Prenom, @date_naiss, @Matiere, @Note;
    -- gestion d'erreur
    BEGIN TRY
    -- bouche tant qu'une ligne a été lue avec succès
    WHILE @@FETCH_STATUS = 0
    BEGIN
       -- si matricule NULL alors c'est une insertion
       IF @Matricule IS NULL
       BEGIN
          INSERT INTO dbo.etudiant VALUES (@Nom, @Prenom, @date_naiss);
    	  -- récupération de la clef auto incrémentée
    	  SET @Matricule = SCOPE_IDENTITY();
       END;
       IF @Matricule IS NOT NULL AND (@Nom IS NOT NULL OR
                                   @Prenom IS NOT NULL OR 
    							   @date_naiss IS NOT NULL)
       BEGIN
       -- sinon c'est une modif
          UPDATE dbo.etudiant
    	  SET    Nom = @Nom, Prenom =  @Prenom, date_naiss = @date_naiss
    	  WHERE  Matricule = @Matricule;
       END;
       -- insertion d'une note, sauf si Note pas spécifiée
       IF @Note IS NOT NULL 
         AND NOT EXISTS(SELECT *
    	                FROM   dbo.Note
    					WHERE  Matiere = @Matiere
    					  AND  Matricule = @Matricule)
       BEGIN
          INSERT INTO dbo.Note (Matiere, Matricule, Note)
    	  SELECT @Matiere, @Matricule, @Note;
       END;
       -- modification d'une note
       IF EXISTS(SELECT *
      	         FROM   dbo.Note
    		     WHERE  Matiere = @Matiere
    			    AND  Matricule = @Matricule)
       BEGIN
          UPDATE dbo.Note 
    	  SET Note = @Note   
    	  WHERE  Matiere = @Matiere
            AND  Matricule = @Matricule;
       END;
    -- lecture ligne suivante
       FETCH C INTO @Matricule, @Nom, @Prenom, @date_naiss, @Matiere, @Note;
    END;
    -- fermutre du curseur
    CLOSE C;
    DEALLOCATE C;
    RETURN;
    -- fin test erreur
    END TRY
    BEGIN CATCH
       IF XACT_STATE() <> 0
          ROLLBACK;
    END CATCH
    GO
    tests :

    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
    23
    --> insérer un étudiant tout seul
    INSERT INTO dbo.V_etudiant_note VALUES (NULL, 'DUPONT', 'Marcel', '1912-01-18', NULL, NULL)
     
    --> insérer un étudiant avec une note :
    INSERT INTO dbo.V_etudiant_note VALUES (NULL, 'DUVAL', 'Éric', '1922-02-15', 'Math', 5.5)
     
    --> modifier les données d'un étudiant (le n°1)
    UPDATE dbo.V_etudiant_note 
    SET    date_naiss = '1998-06-25'
    WHERE  Matricule = 1
     
    --> ajouter une note à l'étudiant 2
    --> insérer un étudiant avec une note :
    INSERT INTO dbo.V_etudiant_note VALUES (2, 'DUVAL', 'Éric', '1922-02-15', 'Physique', 16)
     
    --> modifier une note d'un étudiant :
    UPDATE dbo.V_etudiant_note 
    SET    Note = 18
    WHERE  Matricule = 2
      AND  Matiere = 'Math'
     
    -- vérification :
    SELECT  * FROM dbo.V_etudiant_note
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 846
    Points
    24 846
    Par défaut
    @Modo : Fusionner avec le sujet Sql server 2008 + delphi +ado // fait, merci ! [tourlourou EDIT]

    @heart100 : Tu ne fournis aucun code !
    On ignore d'où tu pars, et multiplier les messages donnent l'impression que tu attends que l'on te réponde sans donner l'impression d'une recherche personnelle

    Tu évoques le maitre-détail, doit-on comprendre que tu as deux grilles
    • une première qui affiche les étudiants
    • une seconde qui affiche les notes de l'étudiant en cours


    Je suppose que tu as (soit en code soit dans la DFM)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QueryNotes.DataSource := DataSourceEtudiants;
    Ensuite dans le SQL de QueryNotes, tu as

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Note WHERE Matricule_etudiant = :Matricule
    Matricule est un paramètre, DataSource est renseigné il va utiliser le champ Matricule de QueryEtudiants via DataSourceEtudiants

    Malheureusement mes compétences ADO, s'arrête là, je l'ai fait en DBX où j'utilisais le Delta (un TClientDataSet) pour générer les requêtes
    En MyDAC, je ne me souviens plus, je ne sais même plus si j'avais fait de l'écriture en mode Maitre\Détail
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2013
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2013
    Messages : 212
    Points : 81
    Points
    81
    Par défaut
    @ShaiLeTroll.

    Je te comprends, mais est-ce que tu vois bien mon problème ? C’était un problème de traitement d'insertion et modification plus qu'un problème de sélection.

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2013
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2013
    Messages : 212
    Points : 81
    Points
    81
    Par défaut
    @SQLPro
    Merci beaucoup pour vos efforts , j'ai bien compris mais c'etait un peu compliquée , je vais faire des éssais et je vous repondrai

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

Discussions similaires

  1. Programmation SQL Server 2008 + Delphi 7
    Par heart100 dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/10/2016, 10h06
  2. Migration d'une application delphi 7 vers sql server 2008
    Par zanoubya dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/05/2012, 10h30
  3. Microsoft SQL Server 2008 Express et noms des classes ADO.NET
    Par Amine Joundy dans le forum ADO.NET
    Réponses: 3
    Dernier message: 22/12/2010, 13h41
  4. [MS SQL Server 2000 - Delphi 6 Ent. - ADO ]
    Par paca_mike dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/07/2005, 20h27

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