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

VB.NET Discussion :

[Dataset et dataAdapter] Problème de logique


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut [Dataset et dataAdapter] Problème de logique
    Bonjour,

    suite à un problème en fin de semaine dernière sur un temps d'insertion de données trop long en base via de multiples appels de proc stock, mon chef m'a conseillé de passer par un dataset pour améliorer mes perfs. cf http://www.developpez.net/forums/sho...d.php?t=455355 pour plus d'explication)

    Je débute avec les dataset et dataAdapter.

    En gros voilà ce qui m'arrive.
    J'ai un planning à remplir pour une semaine (4 périodes par jour) et plusieurs agents. Lorsque j'appuie sur enregistrer j'ai un flux XML qui arrive coté serveur.

    mon flux est du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <A idagent="" idantenne="">
       <T code="" date="" modif="" estAbsence="" />
       <T code="" date="" modif="" estAbsence="" />
       <T code="" date="" modif="" estAbsence="" />
    </A>
    modif prend la valeur 0 ou 1 suivant si le code a été modifié avant l'enregistrement.
    estAbsence prend la valeur 0 ou 1 suivant si mon code est une absence ou une activite.

    Ma table est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table PLNG_ANTENNE (
       IDPLNGANTENNE	int	identity(1,1)	not null,
       ID_AGENT		int		not null,
       ID_ACTIVITE		int		null,
       ID_MA			int		null,
       ID_ANTENNE		int		not null,
       TableTemps_ID		int		not null,
       constraint	PK_PLNG_ANTENNE		primary key	(IDPLNGANTENNE)
    )
    Maintenant mon problème est de savoir comment gérer mon dataset et mon adapter pour insérer ou mettre à jour mes données.

    J'avoue ne pas trop savoir par où commencer...

  2. #2
    Membre chevronné Avatar de npuzin
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 265
    Par défaut
    D'après ce que je comprends, il faudrait que tu utilises la méthode Update du DataAdapter comme dans l'exemple ci-dessous :

    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
    Public Function CreateCommandAndUpdate( _
        ByVal connectionString As String, _
        ByVal queryString As String) As DataSet
     
        Dim dataSet As DataSet = New DataSet
     
        Using connection As New OleDbConnection(connectionString)
            connection.Open()
            Dim dataAdapter As New OleDbDataAdapter()
     
            dataAdapter.SelectCommand = New OleDbCommand( _
                queryString, connection)
     
            Dim commandBuilder As OleDbCommandBuilder = _
                New OleDbCommandBuilder(dataAdapter)
     
            dataAdapter.Fill(dataSet)
     
            ' Code to modify the data in the DataSet here. 
     
            ' Without the OleDbCommandBuilder this line would fail.
            dataAdapter.Update(dataSet)
        End Using
        CreateCommandAndUpdate = dataSet
    End Function
    Plus d'infos : http://msdn2.microsoft.com/en-us/lib...te(VS.80).aspx

  3. #3
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Merci de ta réponse. J'ai juste une question supplémentaire.

    Dois-je remplir mon dataset avec mon xml ou avec la command select de mon adapter.
    C'est là que j'ai un gros problème de compréhension...

  4. #4
    Membre chevronné Avatar de npuzin
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 265
    Par défaut
    Tu dois remplir impérativement ton dataset avec la commande :

    dataAdapter.Fill(dataSet)

    puis tu fais toutes les modifs que tu veux sur ton dataset


    Et ensuite tu appelles la ligne suivante pour faire persister dans ta base tes modifs :

    dataAdapter.Update(dataSet)

  5. #5
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    OK.
    Donc je remplis mon dataset avec la commande et ensuite je le modifie avec mes données de mon xml.

    Je testes ça cet am

  6. #6
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Bon j'ai tenté et ça marche pas mais je me pose une question :
    est-ce qu'il ne faut aps que je rajoute un insertcommand et un updatecommand si je veux que mes données se mettent à jour?

    Je me demandes aussi si le fait que mon select soit compliqué a un effet sur l'update...

    Je vous met mon code en dessous au cas où :
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    Dim lstAgentsXml As XmlNodeList
            Dim agentXml As XmlNode
            Dim periodeXml As XmlNode
     
            Dim i As Integer
            Dim j As Integer
            Dim k As Integer
     
            Dim idAgent As Integer
            Dim codeMa As String
            Dim codeActivite As String
            Dim idjour As Integer
     
            Dim enregistrementTrouve As Boolean = False
     
            Dim ds As DataSet = New DataSet
            Dim table As DataTable
            Dim row As DataRow
     
            Dim connexionStr As String = ConfigurationSettings.AppSettings("ConnectionString")
            Dim requete As String
            Dim connection As SqlConnection = New SqlConnection(connexionStr)
     
     
            connection.Open()
     
            requete = "SELECT P.id_agent, P.id_antenne,"
            requete = requete & "P.TableTemps_ID,"
            requete = requete & "P.id_ma, P.id_activite"
            requete = requete & " FROM PLNG_ANTENNE P JOIN AGENT A ON A.ID_AGENT=P.ID_AGENT "
            requete = requete & " LEFT OUTER JOIN TableTemps T ON P.TableTemps_ID=T.TableTemps_ID "
            requete = requete & " LEFT OUTER JOIN MOTIF_ABSENCE M ON M.ID_MA=P.ID_MA"
            requete = requete & " LEFT OUTER JOIN ACTIVITE AC ON AC.ID_ACTIVITE=P.ID_ACTIVITE"
            requete = requete & " LEFT OUTER JOIN agent_antenne B on A.id_agent=B.id_agent"
     
            If idSemaine = 53 Then
                requete = requete & " WHERE	P.ID_ANTENNE=" & idAntenne.ToString
                requete = requete & " AND	((T.TableTemps_SemaineAnnee=" & idSemaine.ToString & " AND T.TableTemps_Annee=" & annee.ToString & ") OR (T.TableTemps_SemaineAnnee=1 AND T.TableTemps_Annee=" & annee.ToString & "+1))"
                requete = requete & " AND	T.TableTemps_Heure in (8,12,13,14)"
            Else
                requete = requete & " WHERE	P.ID_ANTENNE=" & idAntenne.ToString
                requete = requete & " AND	T.TableTemps_SemaineAnnee=" & idSemaine.ToString
                requete = requete & " AND   T.TableTemps_Annee=" & annee.ToString
                requete = requete & " AND	T.TableTemps_Heure in (8,12,13,14)"
            End If
     
            requete = requete & " ORDER BY A.ID_STATUT, A.code_agent, T.TableTemps_DateEntiere, t.TableTemps_Heure"
            Dim da As SqlDataAdapter = New SqlDataAdapter(requete, connection)
     
            da.Fill(ds)
            table = ds.Tables("Table")
            Try
                'Parcours le fichier xml
                lstAgentsXml = xml.GetElementsByTagName("A")
                For i = 0 To lstAgentsXml.Count - 1
                    agentXml = lstAgentsXml(i)
                    idAgent = agentXml.Attributes("id_agent").Value
                    'Parcours des périodes
                    For j = 0 To agentXml.ChildNodes.Count - 1
                        periodeXml = agentXml.ChildNodes(j)
                        If CInt(periodeXml.Attributes("modif").Value) = 1 Then
                            'Recup du code
                            If CInt(periodeXml.Attributes("estAbsence").Value) = 1 Then
                                codeMa = periodeXml.Attributes("code").Value
                            Else
                                codeActivite = periodeXml.Attributes("code").Value
                            End If
                            'recup de la date
                            idjour = (New BaseDTOFactory).rechercherIdJour(periodeXml.Attributes("date_entiere").Value)
     
                            'Recherche dans le ds
                            enregistrementTrouve = False
                            Dim expression As String = "id_agent=" & idAgent.ToString & " AND tabletemps_id=" & idjour
                            Dim foundRows() As DataRow     'résultat dans des DataRow
                            foundRows = table.Select(expression)
                            If foundRows.Length > 0 Then
                                enregistrementTrouve = True
                            End If
     
                            If enregistrementTrouve Then
                                'update
                                table.Rows(k).Item(3) = (New AbsenceDTOFactory).rechercherIdAbsence(codeMa)
                                table.Rows(k).Item(4) = (New ActiviteDTOFactory).rechercherIdActivite(codeActivite)
                            Else
                                'insert
                                row = ds.Tables("Table").NewRow()
                                row("id_agent") = idAgent
                                row("id_antenne") = idAntenne
                                row("TableTemps_ID") = idjour
                                row("id_ma") = (New AbsenceDTOFactory).rechercherIdAbsence(codeMa)
                                row("id_activite") = (New ActiviteDTOFactory).rechercherIdActivite(codeActivite)
                            End If
                        End If
                    Next
                Next
     
                da.Update(ds)
            Catch ex As Exception
                LOGGER.Error("Erreur dans la fonction InsererSemaine :" & ex.Message)
            Finally
                connection.Close()
            End Try

  7. #7
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Bon j'en suis pas loin
    Mon update fonctionne :
    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
     
    Dim Updatecmd As SqlCommand = New SqlCommand("UPDATE PLNG_ANTENNE SET id_ma=@idMa, id_activite=@idActivite WHERE id_agent=@idAgent and tabletemps_id=@tableTempsId", connection)
            Updatecmd.Parameters.Add("@idAgent", SqlDbType.Int)
            Updatecmd.Parameters.Add("@tableTempsId", SqlDbType.Int)
            Updatecmd.Parameters.Add("@idMa", SqlDbType.Int)
            Updatecmd.Parameters.Add("@idActivite", SqlDbType.Int)
            da.UpdateCommand = Updatecmd
     
    Updatecmd.Parameters("@idAgent").Value = idAgent
                                Updatecmd.Parameters("@tableTempsId").Value = idjour
     
                                table.Rows(k).Item(3) = (New AbsenceDTOFactory).rechercherIdAbsence(codeMa)
                                table.Rows(k).Item(4) = (New ActiviteDTOFactory).rechercherIdActivite(codeActivite)
                                'update
                                If CInt(periodeXml.Attributes("estAbsence").Value) = 1 Then
                                    Updatecmd.Parameters("@idMa").Value = table.Rows(k).Item(3)
                                    Updatecmd.Parameters("@idActivite").Value = System.DBNull.Value
                                Else
                                    Updatecmd.Parameters("@idMa").Value = System.DBNull.Value
                                    Updatecmd.Parameters("@idActivite").Value = table.Rows(k).Item(4)
                                End If
                                da.Update(ds)
    Par contre mon insert ne fonctionne pas et je n'ai pas de message d'erreur

    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
     
    Dim InsertCmd As SqlCommand = New SqlCommand("INSERT INTO PLNG_ANTENNE(id_ma,id_activite,id_agent,id_antenne,tabletemps_id) values(@idMa,@idActivite,@idAgent,@idAntenne,@tableTempsId)", connection)
            InsertCmd.Parameters.Add("@idAgent", SqlDbType.Int)
            InsertCmd.Parameters.Add("@tableTempsId", SqlDbType.Int)
            InsertCmd.Parameters.Add("@idMa", SqlDbType.Int)
            InsertCmd.Parameters.Add("@idActivite", SqlDbType.Int)
            InsertCmd.Parameters.Add("@idAntenne", SqlDbType.Int)
            da.InsertCommand = InsertCmd
     
    InsertCmd.Parameters("@idAgent").Value = idAgent
                                InsertCmd.Parameters("@idAntenne").Value = idAntenne
                                InsertCmd.Parameters("@tableTempsId").Value = idjour
     
                                'insert
                                row = ds.Tables("Table").NewRow()
                                row("id_agent") = idAgent
                                row("id_antenne") = idAntenne
                                row("TableTemps_ID") = idjour
                                row("id_ma") = (New AbsenceDTOFactory).rechercherIdAbsence(codeMa)
                                row("id_activite") = (New ActiviteDTOFactory).rechercherIdActivite(codeActivite)
     
                                If CInt(periodeXml.Attributes("estAbsence").Value) = 1 Then
                                    InsertCmd.Parameters("@idMa").Value = row("id_ma")
                                    InsertCmd.Parameters("@idActivite").Value = System.DBNull.Value
                                Else
                                    InsertCmd.Parameters("@idMa").Value = System.DBNull.Value
                                    InsertCmd.Parameters("@idActivite").Value = row("id_activite")
                                End If
                                da.Update(ds)
    une petite idée?

  8. #8
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Arf j'ai trouvé.
    j'avais oublié le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ds.Tables("Table").Rows.Add(row)
    bon par contre ça n'améliore pas vraiment mais perf

  9. #9
    Membre chevronné Avatar de npuzin
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 265
    Par défaut
    C'est quelle ligne qui rame ?

    Le Fill ou l'update ?

  10. #10
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Ben mon souci je pense c'est que je n'arrive pas à faire un update général, je suis obligé de le faire ligne par ligne et ça me semble pas bon.
    Je pense que cela doit venir de mes updatecommand et insertcommand.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/01/2007, 17h59
  2. [C#] Mise a jour dataset sans dataAdapter
    Par King-Greg dans le forum Accès aux données
    Réponses: 5
    Dernier message: 10/12/2006, 15h17
  3. Problème de logique :)
    Par deaven dans le forum Oracle
    Réponses: 1
    Dernier message: 13/10/2006, 18h49
  4. Réponses: 10
    Dernier message: 14/07/2006, 20h22
  5. Petit problème de logique...
    Par insomniak dans le forum C++
    Réponses: 15
    Dernier message: 31/10/2005, 20h13

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