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

Accès aux données Discussion :

[Linq to Sql] Insert et delete


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut [Linq to Sql] Insert et delete
    Bonjour !



    Voilà que j'essaie de suivre les tutoriaux de la page suivante: http://msdn.microsoft.com/fr-fr/data/cc904318.aspx



    Le soucis, lorsque je veux ajouter ou supprimer un produit:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Code SnippetNorthwindDataContext db = new NorthwindDataContext 
     
    var toyProducts = from p in db.Products where p.Category.CategoryName.Contains("toy") select p
     
    db.Products.RemoveAll(toyProducts);
     
    db.submitChanges();

    Et mon code actuel (pour la suppression):


    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
     
     
    DataClasses1DataContext db = new DataClasses1DataContext();
     
    //Rcupration de l'id
     
    string id = this.gridStandard.CurrentRow.Cells["id"].Value.ToString();
     
    var delClients = from p in db.xdb_clients where p.id.Contains(id) select p;
     
    db.xdb_clients.removeAll(delClients); //RemoveAll n'existe pas...
     
    try
     
    {
     
    db.SubmitChanges();
     
    }
     
    catch (Exception dex)
     
    {
     
    MessageBox.Show(dex.Message, "Erreurs", MessageBoxButtons.OK, MessageBoxIcon.Information);
     
    //Gestion d'erreur dlinq, on peut faire mieux que mon msgbox?
     
    }
     
    finally
     
    {
     
    this.gridStandard.DataSource = delClients.ToList(); //Mise à jour
     
    }


    Vous trouverez les problèmes dans le code, soit, removeAll et la gestion de l'erreur...


    Ainsi que pour l'insert


    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
     
    NorthwindDataContext db = new NorthwindDataContext 
     
    Category category = new Category();
     
    category.CategoryNAme = "Scott's Toys";
     
     
    Product product1 = new Product();
     
    product1.ProductName = "Toy 1";
     
     
     
    Product product2 = new Product();
     
    product2.productName = "Toy 2";
     
     
     
    category.Products.add(product1);
     
    category.Products.add(product2);
     
    db.Categories.Add(category);
     
    db.submitchanges();





    Mon code actuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Code SnippetDataClasses1DataContext db = new DataClasses1DataContext();
     
     
     
    db.SubmitChanges();
    \o/. Ici le problème, comme en haut d'ailleurs, c'est que je n'ai pas "Category" ou "Product" à quoi est-ce que sa correspond?



    Je vois dans son tutoriel "[Version RTM] La méthode Add() de l'interface ITable est renommé en InsertOnSubmit().

    Remplacer donc, dans l'exemple si-dessus, la ligne << db.Categories.Add(category) >> par << db.Categories.InsertOnSubmit(category)>>.



    Bah je n'ai pas d'interface Itable (mais la méthode insertonsubmit existe, je l'ai dans mon intellisens).


    Comment donc faire un delete et un insert en linq to sql?

    Meilleures salutations !

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Sais-tu ce qu'est une interface ? Parce que quand tu dis que tu n'as pas l'interface ITable, c'est étrange comme affirmation.

    Sinon, pour la suppression, c'est tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DeleteOnSubmit
    //ou
    DeleteAllOnSubmit
    Et non plus, RemoveAll.

    Pour l'ajout, c'est comme dans l'exemple que tu as donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InsertOnSubmit
    // ou
    InsertAllOnSubmit
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    ce que je veux dire:
    var delClients = from p in db.xdb_clients where p.id.Contains(id) select p;
    erreur:
    Error 1 'int' does not contain a definition for 'Contains' and no extension method 'Contains' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?)

    db.xdb_clients.DeleteOnSubmit(delClients);
    Error 2 The best overloaded method match for 'System.Data.Linq.Table<CourtageProBeta2.xdb_client>.DeleteOnSubmit(CourtageProBeta2.xdb_client)' has some invalid arguments

    delClients (de la ligne précédente)
    Error 3 Argument '1': cannot convert from 'System.Linq.IQueryable<CourtageProBeta2.xdb_client>' to 'CourtageProBeta2.xdb_client'

    ------------------------------------------------------
    pour l'insert:
    Je n'ai rien qui ressemble à Category category = new Category(); et Products product = new Products(); comme dans le tuto...

    Meilleures salutations

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    "p.Id", Id est de quel type ? Ce ne serait pas un Int ?

    Si c'est le cas, "Contains" n'existe pas sur le type Int. A toi de convertire ce type en string.

    Personnelement, j'écrirais ta condition plutôt comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where p.id.ToString() == id
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    Super sa fonctionne pour ça ! Mais... pour le reste?

    Meilleure salutations

    en fait:
    http://www.dominiqueverriere.com/con...x?NoArticle=84

    Il va chercher ou son instanciation Article ... = new Article(); ???

    A+

  6. #6
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Tu utilises Linq to sql via le designer ?

    Si oui, pour chaque entité de ton schéma Linq to SQL, une classe a été créée pour toi.

    Exemple, dans ton schéma, tu as un entité appelée "Customer" et bien Linq to SQL t'a créé une classe Customer qui permet le mapping avec la table en base de données (voir les attributs de la classe en question). Tu trouveras ces classes dans le fichier "FichierLinqToSQL.Designer.cs".

    Tu peux donc instancier des objets Customer comme n'importe quelle autre classe.

    Ensuite, si tu crées une instance, tu peux l'ajouter à ton contexte en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Customer monCustomer = new Customer();
    monCustomer.Name = "Jérôme";
    insctanceDataContext.Customers.InsertOnSubmit(monCustomer);
    Ajouter un objet de cette façon signifie que tu désires ajouter un Customer dans ta base de données.

    Et cette action sera exécutée en base de données quand tu valideras tous tes changements grâce à la méthode SubmitChanges de ton contexte.
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci de votre réponse, voici donc lorsque l'on clic sur le bouton d'insertion:

    http://img518.imageshack.us/my.php?i...rinsertyw2.png

    et le code correspondant:


    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
     
                DataClasses1DataContext db = new DataClasses1DataContext();
     
                xdb_client xdbClient = new xdb_client();
                xdbClient.titre = titre;
                xdbClient.lastName = nom;
                xdbClient.firstName = prenom;
                xdbClient.tel_prive = tel_priv;
                xdbClient.tel_prof = tel_prof;
                xdbClient.natel = natel;
                xdbClient.fax = fax;
                xdbClient.email = email;
                xdbClient.email_prof = email_prof;
                xdbClient.societe = societe;
     
                db.xdb_clients.InsertOnSubmit(xdbClient);
                try
                {
                    db.SubmitChanges();
                }
                catch (Exception sex)
                {
                    MessageBox.Show(sex.Message, "Erreurs", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    Est-ce que vous savez d'où peut venir l'erreur ?


    Meilleure salutations

  9. #9
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Le message d'erreur te dit simplement que l'id de la ta clé primaire n'est pas configuré pour se générer automatiquement à chaque insert.

    Tu dois spécifier toi même l'id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xdbClient.ChampID = ...;
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    donc, xdbClients.Id = xdb_clients.id.last() + 1 ou un truc comme ça?

    edit: Voilà l'erreur lorsque j'ai tout mis à true
    http://img371.imageshack.us/my.php?i...neratedst6.png

    A+

  11. #11
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Citation Envoyé par cKmel Voir le message
    Salut,

    donc, xdbClients.Id = xdb_clients.id.last() + 1 ou un truc comme ça?

    y a pas moyen de le générer simplement, en mettre une propriété sur True?
    J'aurais plutôt opté pour xdb_clients.Max(client => client.id) + 1 parce qu'avec ta solution, si ta séquence n'est pas triée par id ascendant, ça risque pas de fonctionner très bien pour générer un id unique.

    Et oui, il y a moyen de rendre ça automatique et le spécifiant au niveau du champ de ta table (en base de données donc).
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    j'ai éditer mon poste car j'ai vu comment tout mettre à true, regarde mon précédent message.

    A+

  13. #13
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Ta table client a des champs de type clé étrangère ?
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23

  15. #15
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Et le champ "adress" de la table "xdb_client" ?
    Je vois que tu as une table "xdb_adress", aucun rapport ?
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    techniquement parlant, ils doivent être lier, mais la j'ai supprimer en pensant que c'était ça.

  17. #17
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Ca dépend...
    Tu as supprimé le lien où ? Dans ta base de données ou dans ton schéma Linq to Sql ?
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Salut,

    dans le schémas là.

  19. #19
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Si ce n'est que dans le schéma, l'intérgrité au niveau de la base de données tient toujours.

    Ton schéma Linq to SQL n'est qu'un mapping sur ta base de données.

    Est-ce que par hasard le champ "adress" de ta table client interdit une valeur nulle ?
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Non, null est autorisé:


    http://img396.imageshack.us/my.php?image=resumkh8.png
    http://img513.imageshack.us/my.php?image=erreurfy7.png

    Meilleures salutations

    Edit: Est-ce qu'il serait plus simple d'utiliser une base MySQL en ligne?
    A+

Discussions similaires

  1. LINQ to SQL] Tracer les requêtes SQL d'Insert/Update/Delete
    Par annalady dans le forum Accès aux données
    Réponses: 5
    Dernier message: 30/07/2009, 10h17
  2. [Linq to Sql] Problème d'insert en base de données
    Par Nyphel dans le forum Accès aux données
    Réponses: 3
    Dernier message: 21/11/2008, 23h31
  3. [Linq to Sql] Insert ou update ? telle est la question ...
    Par Ntotor dans le forum Accès aux données
    Réponses: 5
    Dernier message: 19/11/2008, 14h24
  4. [Linq To SQL] Insertion non voulue
    Par LE NEINDRE dans le forum Accès aux données
    Réponses: 3
    Dernier message: 27/10/2008, 13h51
  5. [Linq to Sql] Insertion de quelques champs uniquement
    Par binoo dans le forum Accès aux données
    Réponses: 5
    Dernier message: 16/02/2008, 14h29

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