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

ADO.NET Discussion :

Insert + Update


Sujet :

ADO.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut Insert + Update
    Bonjour,
    j'ai une table (SqlServer) dans la quelle je doit insérer des données ou mettre à jour si ces dernier existent, à partir d'une liste (customers).

    Ci-dessous un exemple de mon code :

    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
     
     
    // ... ouverture de la connexion ...
     
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM [PRICING].[dbo].[Customer]", connexion);
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
     
    DataSet dataSet = new DataSet("Customer");                
    adapter.Fill(dataSet, "Customer");
     
    foreach (Customer item in customers)
    {
    string expression = String.Format("SheetId = {0} AND SalesOrganisation =   '{1}' AND DistributionChannel = '{2}' AND Division = '{3}' AND CustomerNo = '{4}'", sheetId, item.SalesOrganisation, item.DistributionChannel, item.Division, item.CustomerId);
     
    // Cette recherche consomme bcp de temps !
    DataRow[] foundRows = dataSet.Tables["Customer"].Select(expression);
     
    if (foundRows.Length > 0)
    {
    DataRow dataRow = foundRows[0];
    dataRow.BeginEdit();
     
    // ... maj de tous les champs ...
     
    dataRow.EndEdit();
    else
    {
    DataRow dataRow = dataSet.Tables["Customer"].NewRow();
     
    // ... maj de tous les champs ...
     
    dataSet.Tables["Customer"].Rows.Add(dataRow);
    }
    }
     
    adapter.Update(dataSet, "Customer"); 
     
    // ... fermeture de la connexion ...
    Comment puis je optimiser ça ? car c'est long ...
    Merci de votre aide.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par lolo5935 Voir le message
    Comment puis je optimiser ça ? car c'est long ...

    C'est normal : c'est codé pour être le moins optimal possible et le plus lent possible.

    Ah ? ce n'était pas voulu ...

    Bon, dans ce cas on a du mal à comprendre pour quoi tu montes ta table dans un DataTable pour ensuite faire uen requête LINQ dessus au lieu de monter directement les données nécessaire par la requête SQL.

    Ensuite, dans l'absolu (cela devient d('ailleurs une manie ces derniers temps), on ne voit même pas l'interêt de "monter" les données coté client pour les réécrire dans la base alors qu'il est mille fois plus logique et simple de faire faire la modif par une proc stoc.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Non ce n'est pas voulu, c'est pour cette raison que je pose la question

    Bon, dans ce cas on a du mal à comprendre pour quoi tu montes ta table dans un DataTable pour ensuite faire une requête LINQ dessus au lieu de monter directement les données nécessaire par la requête SQL.
    Une requête LINQ ??
    J'alimente un dataset pour ensuite travailler sur les datarows
    avant d'appeler adapter.Update(dataSet, "Customer")

    Le but est de pouvoir insérer des données ou mettre à jour si ces dernier existent.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par lolo5935 Voir le message
    Non ce n'est pas voulu, c'est pour cette raison que je pose la question



    Une requête LINQ ??
    En effet, c'est sur la table : la méthode Select. Mais son usage est absurde alors qu'il était plus simple de se contenter de la requête dans la table Sql pour monter les données.

    J'alimente un dataset pour ensuite travailler sur les datarows
    avant d'appeler adapter.Update(dataSet, "Customer")

    Le but est de pouvoir insérer des données ou mettre à jour si ces dernier existent.
    Comme déjà dit, ça n'a pas de sens : autant faire bosser le SGBD.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Mais son usage est absurde alors qu'il était plus simple de se contenter de la requête dans la table Sql pour monter les données.
    Ajouter une clause dans le select pour récupérer uniquement les enregistrements à mettre à jour ... ouais et j'en fais quoi des nouveaux clients (dans ma liste customers) à insérer ?

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par lolo5935 Voir le message
    Ajouter une clause dans le select pour récupérer uniquement les enregistrements à mettre à jour ... ouais et j'en fais quoi des nouveaux clients (dans ma liste customers) à insérer ?

    J'ai l'impression pourtant d'écrire en Français. Donc tu ne lis pas.

    IL N'Y PAS LIEU DE PASSER PAR LE CODE CLIENT POUR FAIRE CE QUE TU VEUX FAIRE.

    Fais une proc stoc en SQL qui reçoit les paramétres de mise à jour (si j'en crois ton code, c'est une mise à jour massive) et qui fait tes upadet/insert et c'est tout.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Ou aussi tout inserer dans une table temporaire et faire un MERGE

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Ou aussi tout inserer dans une table temporaire et faire un MERGE
    C'est aussi une possibilité; ce que je voulais souligner, c'est que de toute manière il n'y a pas lieu pour un traitement en masse de :

    - ramener des données vers le client
    - les modifier
    - les renvoyer vers le SGBD.

    Ce doit être la conséquence néfaste de l'amélioration des perfs des réseaux : (et de l'abus d'ORM) on voit de plus en plus ce genre de truc

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ou aussi tout inserer dans une table temporaire et faire un MERGE
    mmmm je pense qu'il vaut mieux éviter de tenter notre ami de saturer notre chère et tendre TempDB....


    Ce doit être la conséquence néfaste de l'amélioration des perfs des réseaux : (et de l'abus d'ORM) on voit de plus en plus ce genre de truc
    tout à fait d'accord.


    foreach (Customer item in customers)
    {
    string expression = String.Format("SheetId = {0} AND SalesOrganisation = '{1}' AND DistributionChannel = '{2}' AND Division = '{3}' AND CustomerNo = '{4}'", sheetId, item.SalesOrganisation, item.DistributionChannel, item.Division, item.CustomerId);

    // Cette recherche consomme bcp de temps !
    DataRow[] foundRows = dataSet.Tables["Customer"].Select(expression);

    if (foundRows.Length > 0)
    {
    DataRow dataRow = foundRows[0];
    dataRow.BeginEdit();

    // ... maj de tous les champs ...

    dataRow.EndEdit();
    else
    {
    DataRow dataRow = dataSet.Tables["Customer"].NewRow();

    // ... maj de tous les champs ...

    dataSet.Tables["Customer"].Rows.Add(dataRow);
    }
    }

    adapter.Update(dataSet, "Customer");

    // ... fermeture de la connexion ...
    Mon dieu combien avez vous de customer dans votre base? 1à j'espère sinon ce doit être plus que lent!

    Bon pour rester poli: "ça il te faut pas le faire hein"


    Que voulez vous faire exactement?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Ok les gens, j'ai bien compris le message et je demande qu'à faire les choses le mieux possible
    Ce que je dois faire, pour résumé :

    J'ai deux services.
    Le premier vient alimenter deux tables à partir de deux fichiers csv.
    Bon là pas de ps, nous sommes d'accord ? je lis les fichiers csv et je viens insérer mes enregistrements (brut) dans chacune des deux tables. Pour ce faire, j'utilise un InsertCommand et ça se passe très bien et très vite

    Ensuite, à partir de ces deux tables (temporaires), je dois alimenter plusieurs autres tables en respectant certaines règles métier. C'est le rôle du second service.

    A part peut être pour les clients (1er fichier csv), où je pourrais utiliser une ps pour alimenter mon autre table (car peu de changement), je ne vois pas comment m'abstenir de charger dans mon application mon autre table pour traiter mes données (cf. règles métier) ... Ok pour les ps et je ne demande qu'à apprendre mais j'ai du mal à considérer que la ps est la solution à mon problème (en tout cas pour cette partie) ?

    Merci d'éclairer ma lanterne

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Bon là pas de ps, nous sommes d'accord ? je lis les fichiers csv et je viens insérer mes enregistrements dans chacune des deux tables. Pour ce faire, j'utilise un InsertCommand et ça se passe très bien et très vite
    Donc ligne par ligne???

    Ensuite, à partir de ces deux tables (temporaires), je dois alimenter plusieurs autres tables en respectant certaines règles métier. C'est le rôle du second service.
    C'est là l'eternel problème: vous devez embarquer cette logique métier en procédure stockée,

    La procédure stockée va vous permettre de faire de manière ensembliste (sur toutes les lignes à la fois) les logiques d'INSERT/UPDATE...


    Ce sera instantanée...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Donc ligne par ligne???
    Non, j'ai dit que c'était rapide

    Exemple de code pour l'insertion :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    connexion = new SqlConnection(connexionString);
    connexion.Open();
     
    string request = "SELECT * FROM [PRICING].[dbo].[XCustomer]";
     
    // Chargement de la liste des xcustomers dans le dataSet
    SqlDataAdapter adapter = new SqlDataAdapter(request, connexion);
    DataSet dataSet = new DataSet("XCustomer");
    adapter.Fill(dataSet, "XCustomer");              
     
    // Paramètrage de la commande InsertCommand
    SqlCommand command = new SqlCommand("INSERT INTO [PRICING].[dbo].[XCustomer] ([CustomerId], [SalesOrganisation], [DistributionChannel], [Division], [Name1], [Name2], [Street1], [Street2], [Street3], [HouseNumber], [PostalCode], [City], [RegionDescription], [CountryCode], [CountryDescription], [Phone], [Contact], [Email], [Fax], [Communication], [PriceList], [CustomerGroup], [SalesRepZ4], [SalesRepZ5], [SalesRepZ6], [Language], [PriceGroup], [CustomerIncoterm], [Currency], [ItemProposalNo], [ImportId]) "
    "VALUES (@CustomerId, @SalesOrganisation, @DistributionChannel, @Division, @Name1, @Name2, @Street1, @Street2, @Street3, @HouseNumber, @PostalCode, @City, @RegionDescription, @CountryCode, @CountryDescription, @Phone, @Contact, @Email, @Fax, @Communication, @PriceList, @CustomerGroup, @SalesRepZ4, @SalesRepZ5, @SalesRepZ6, @Language, @PriceGroup, @CustomerIncoterm, @Currency, @ItemProposalNo, @ImportId)", connexion);
     
    command.Parameters.Add("@CustomerId", SqlDbType.NVarChar, 10, "CustomerId");
    command.Parameters.Add("@SalesOrganisation", SqlDbType.NVarChar, 4, "SalesOrganisation");
    command.Parameters.Add("@DistributionChannel", SqlDbType.NVarChar, 2, "DistributionChannel");
    command.Parameters.Add("@Division", SqlDbType.NVarChar, 2, "Division");
    command.Parameters.Add("@Name1", SqlDbType.NVarChar, 35, "Name1");
    command.Parameters.Add("@Name2", SqlDbType.NVarChar, 35, "Name2");
    command.Parameters.Add("@Street1", SqlDbType.NVarChar, 40, "Street1");
    command.Parameters.Add("@Street2", SqlDbType.NVarChar, 40, "Street2");
    command.Parameters.Add("@Street3", SqlDbType.NVarChar, 40, "Street3");
    command.Parameters.Add("@HouseNumber", SqlDbType.NVarChar, 35, "HouseNumber");
    command.Parameters.Add("@PostalCode", SqlDbType.NVarChar, 10, "PostalCode");
    command.Parameters.Add("@City", SqlDbType.NVarChar, 35, "City");
    command.Parameters.Add("@RegionDescription", SqlDbType.NVarChar, 35, "RegionDescription");
    command.Parameters.Add("@CountryCode", SqlDbType.NVarChar, 3, "CountryCode");
    command.Parameters.Add("@CountryDescription", SqlDbType.NVarChar, 35, "CountryDescription");                
    command.Parameters.Add("@Phone", SqlDbType.NVarChar, 35, "Phone");
    command.Parameters.Add("@Contact", SqlDbType.NVarChar, 50, "Contact");
    command.Parameters.Add("@Email", SqlDbType.NVarChar, 250, "Email");
    command.Parameters.Add("@Fax", SqlDbType.NVarChar, 35, "Fax");
    command.Parameters.Add("@Communication", SqlDbType.NVarChar, 50, "Communication");
    command.Parameters.Add("@PriceList", SqlDbType.NVarChar, 2, "PriceList");
    command.Parameters.Add("@CustomerGroup", SqlDbType.NVarChar, 4, "CustomerGroup");
    command.Parameters.Add("@SalesRepZ4", SqlDbType.NVarChar, 6, "SalesRepZ4");
    command.Parameters.Add("@SalesRepZ5", SqlDbType.NVarChar, 6, "SalesRepZ5");
    command.Parameters.Add("@SalesRepZ6", SqlDbType.NVarChar, 6, "SalesRepZ6");
    command.Parameters.Add("@Language", SqlDbType.NVarChar, 2, "Language");
    command.Parameters.Add("@PriceGroup", SqlDbType.NVarChar, 2, "PriceGroup");
    command.Parameters.Add("@CustomerIncoterm", SqlDbType.NVarChar, 3, "CustomerIncoterm");
    command.Parameters.Add("@Currency", SqlDbType.NVarChar, 5, "Currency");
    command.Parameters.Add("@ItemProposalNo", SqlDbType.NVarChar, 10, "ItemProposalNo");
    command.Parameters.Add("@ImportId", SqlDbType.Int, 4, "ImportId");
     
    adapter.InsertCommand = command;
     
    foreach (XCustomer item in xCustomers)
    {
    DataRow dataRow = dataSet.Tables["XCustomer"].NewRow();
     
    dataRow["CustomerId"] = item.CustomerId;
    dataRow["SalesOrganisation"] = item.SalesOrganisation;
    dataRow["DistributionChannel"] = item.DistributionChannel;
    dataRow["Division"] = item.Division;
    dataRow["ImportId"] = importId;                  
     
    if (item.Name1 != string.Empty) dataRow["Name1"] = item.Name1; else dataRow["Name1"] = DBNull.Value;
    if (item.Name2 != string.Empty) dataRow["Name2"] = item.Name2; else dataRow["Name2"] = DBNull.Value;
    if (item.Street1 != string.Empty) dataRow["Street1"] = item.Street1; else dataRow["Street1"] = DBNull.Value;
    if (item.Street2 != string.Empty) dataRow["Street2"] = item.Street2; else dataRow["Street2"] = DBNull.Value;
    if (item.Street3 != string.Empty) dataRow["Street3"] = item.Street3; else dataRow["Street3"] = DBNull.Value;
    if (item.HouseNumber != string.Empty) dataRow["HouseNumber"] = item.HouseNumber; else dataRow["HouseNumber"] = DBNull.Value;
    if (item.PostalCode != string.Empty) dataRow["PostalCode"] = item.PostalCode; else dataRow["PostalCode"] = DBNull.Value;
    if (item.City != string.Empty) dataRow["City"] = item.City; else dataRow["City"] = DBNull.Value;
    if (item.RegionDescription != string.Empty) dataRow["RegionDescription"] = item.RegionDescription; else dataRow["RegionDescription"] = DBNull.Value;
    if (item.CountryCode != string.Empty) dataRow["CountryCode"] = item.CountryCode; else dataRow["CountryCode"] = DBNull.Value;
    if (item.CountryDescription != string.Empty) dataRow["CountryDescription"] = item.CountryDescription; else dataRow["CountryDescription"] = DBNull.Value;
    if (item.Phone != string.Empty) dataRow["Phone"] = item.Phone; else dataRow["Phone"] = DBNull.Value;
    if (item.Contact != string.Empty) dataRow["Contact"] = item.Contact; else dataRow["Contact"] = DBNull.Value;
    if (item.Email != string.Empty) dataRow["Email"] = item.Email; else dataRow["Email"] = DBNull.Value;
    if (item.Fax != string.Empty) dataRow["Fax"] = item.Fax; else dataRow["Fax"] = DBNull.Value;
    if (item.Communication != string.Empty) dataRow["Communication"] = item.Communication; else dataRow["Communication"] = DBNull.Value;
    if (item.PriceList != string.Empty) dataRow["PriceList"] = item.PriceList; else dataRow["PriceList"] = DBNull.Value;
     if (item.CustomerGroup != string.Empty) dataRow["CustomerGroup"] = item.CustomerGroup; else dataRow["CustomerGroup"] = DBNull.Value;
    if (item.SalesRepZ4 != string.Empty) dataRow["SalesRepZ4"] = item.SalesRepZ4; else dataRow["SalesRepZ4"] = DBNull.Value;
    if (item.SalesRepZ5 != string.Empty) dataRow["SalesRepZ5"] = item.SalesRepZ5; else dataRow["SalesRepZ5"] = DBNull.Value;
    if (item.SalesRepZ6 != string.Empty) dataRow["SalesRepZ6"] = item.SalesRepZ6; else dataRow["SalesRepZ6"] = DBNull.Value;
    if (item.Language != string.Empty) dataRow["Language"] = item.Language; else dataRow["Language"] = DBNull.Value;
    if (item.PriceGroup != string.Empty) dataRow["PriceGroup"] = item.PriceGroup; else dataRow["PriceGroup"] = DBNull.Value;
    if (item.CustomerIncoterm != string.Empty) dataRow["CustomerIncoterm"] = item.Name1; else dataRow["CustomerIncoterm"] = DBNull.Value;
    if (item.Currency != string.Empty) dataRow["Currency"] = item.Currency; else dataRow["Currency"] = DBNull.Value;
    if (item.ItemProposalNo != string.Empty) dataRow["ItemProposalNo"] = item.ItemProposalNo; else dataRow["ItemProposalNo"] = DBNull.Value;                    
     
    dataSet.Tables["XCustomer"].Rows.Add(dataRow);
    }
     
    // Mise à jour de la source de données à partir du dataSet                
    adapter.Update(dataSet, "XCustomer");
    C'est là l'eternel problème: vous devez embarquer cette logique métier en procédure stockée,
    La procédure stockée va vous permettre de faire de manière ensembliste (sur toutes les lignes à la fois) les logiques d'INSERT/UPDATE...
    Implémenter les règles métier dans le SGBD
    Niveau architecture c'est très moyen, non ?

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par lolo5935 Voir le message
    Implémenter les règles métier dans le SGBD
    Niveau architecture c'est très moyen, non ?
    Ah ? parce que balader des données entre serveurs sans raison, c'est pas moyen ça ??

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #14
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    La méthode consistant à faire une copie de la base de donnée COMPLETE en local dans un dataset (puis de travailler dessus et renvoyé le résultat avec update) n'est pas fondamentalement fausse. (Je vais me faire tapper dessus)

    Mais elle a l'inconvénient d'être particulièrement lente et par conséquence pas adaptée si la base de donnée est grande et que la portion de donnée utilisée est faible (perte de temps et de ressource à charger/gérer des données inutilement). C'est ce qui a l'air d'arriver dans ton cas.

    Il faut alors la jouer plus finement en téléchargeant uniquement ce qui est nécessaire (et si possible au besoin ET avec le moins de requête possible). Dans l'optique d'un traitement de donnée pure (pas d'affichage, de reporting ou je sais pas quoi), il est plus rapide d'utiliser une procédure stockée (qui s'executera directement sur le serveur SQL) vu qu'il n'y a "en théorie" aucune nécessité de rapatrier ces données ailleurs si c'est juste pour des modifications. (Néanmoins pour x raisons c'est parfois pas la solution choisie)

    Je ne dis pas que ce que tu fais est faux. C'est simplement que la méthodologie que tu utilises pour traiter ce cas n'est pas adaptée.

    D'aucun diront la copie complète de dataset c'est une technique de débutant. Moi j'y réponds que si le 50% des personnes qui viennent poser des questions sur ce forum maîtrisaient au moins ça on aurait moins l'impression d'être pris pour des cons avec certaines questions.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Ah Sinople merci d'argumenter un peu plus.
    En effet, pour mon besoin la ps est la solution (traitement de table à table, pas d'affichage, pas de reporting, ect ...) comme tu le précises. Ok j'avoue ! je me rends, ne tirez plus !
    Cette erreur vient du fait de ma faible connaissance des ps ...
    Bon ben je vais m'y mettre !
    Merci d'avoir éclairer ma lanterne

  16. #16
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ah Sinople merci d'argumenter un peu plus.
    En effet, pour mon besoin la ps est la solution (traitement de table à table, pas d'affichage, pas de reporting, ect ...) comme tu le précises. Ok j'avoue ! je me rends, ne tirez plus !
    Cette erreur vient du fait de ma faible connaissance des ps ...
    Bon ben je vais m'y mettre !
    Merci d'avoir éclairer ma lanterne
    Ya pas de problème la méconnaissance des possibilité et des bonnes pratiques de découplage des taches en SGBD et code client est récurrente...

    Le tout est de s'en rendre compte, ce qui est votre cas...

    D'une manière GENERALE tout traitement un temps soit peu massif de données, c'est le boulot du SGBD la question ne doit pas se poser (D=données).
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  17. #17
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Implémenter les règles métier dans le SGBD
    Les règle métier inhérentes a vos données doivent toute être implémentée dans votre sgbd...

    Que se passera t'il le jour ou une autre application fera de l'intégration de données dans votre application? elle mettra votre base de données dans un eta^t totalement instablepour votre code client...

    C'est pourquoi on doit apporter un soin tout particulier à la modélisation et apposer toutes les contraintes nécessaires (NOT NULL,DEFAULT,UNIQUE, CHECK etc.)
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  18. #18
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Voir même avec des triggers pour géré les contraintes non conventionnelles !

    Reste que ces fonctionnalités ne sont pas disponibles sur toutes les bases de données. Que ça demande quand même un certain niveau de connaissance technique.

    Et que la bonne façon de faire en informatique est souvent une notion, il faut l'avouer, assez floue.

  19. #19
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par sinople Voir le message
    Voir même avec des triggers pour géré les contraintes non conventionnelles !

    Reste que ces fonctionnalités ne sont pas disponibles sur toutes les bases de données. Que ça demande quand même un certain niveau de connaissance technique.
    Les proc stoc, fonctions, et trigggers sont disponibles sur tous les SGBD dignes de ce nom (pas toujours sur les bases in-process, mais ce n'est pas illégitime puisque ce type de base est par définition à accès unique et tourne sur le processus du client, donc il n'y a pas d'avantage à "extirper" du code de l'appli vers la base dans ce cas).

    Et que la bonne façon de faire en informatique est souvent une notion, il faut l'avouer, assez floue.
    Il y a quand même des règles de pratiques, sur lesquelles il y a consensus. Tout au plus l'application des règles fait parfois débat.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  20. #20
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Il y a quand même des règles de pratiques, sur lesquelles il y a consensus. Tout au plus l'application des règles fait parfois débat.
    Au niveau de l'équipe - Je l'espère
    Au niveau de l'entreprise - Il faudrait
    Au niveau mondiale - On oublie


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

Discussions similaires

  1. INSERT/UPDATE via DBLink
    Par Wilk dans le forum Oracle
    Réponses: 1
    Dernier message: 15/03/2006, 14h51
  2. [C#][2.0] Traitement de Formulaire (Insert / Update)
    Par softflower dans le forum ASP.NET
    Réponses: 7
    Dernier message: 17/02/2006, 13h44
  3. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  4. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31
  5. [Info] Insert/Update si problèmes divers
    Par portu dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 10h17

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