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 :

[VB.NET][MsSQL] alimenter un dataSet depuis un SqlDataReader


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [VB.NET][MsSQL] alimenter un dataSet depuis un SqlDataReader
    Bonjour,

    Je cherche à récupéré les informations d'une requête.

    Je ne cherche pas d'élément graphique, juste une structure pour récupérer le résultat de la requête avant leur manipulation.

    Il semble que le Dataset remplirait cette fonction.

    Cependant je ne sais pas comment utiliser cette élément depuis un SqlDataReader.

    Voici le code que j'ai actuellement pour l'appel à 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Public Sub PS_Select_Employee_Production_Daily_Assignment_fct_periode()
            Dim DateDuJour As String
            Dim LundiDuJour As String
            Dim DateDuJourPlusNbSem As String
     
            If dateJ.Text <> "" Then
                DateDuJour = dateJ.Text
            Else
                DateDuJour = DateTime.Now.Date
            End If
     
            LundiDuJour = lundiSemDateJour(DateDuJour)
            DateDuJourPlusNbSem = DatePlusNbSem(LundiDuJour, nbSemaine)
     
            maCmd = maCnx.CreateCommand
            maCmd.CommandType = CommandType.StoredProcedure
            maCmd.CommandText = "PS_Select_Employee_Production_Daily_Assignment_fct_periode"
     
            maCmd.Parameters.Add(New SqlParameter("@date_debut", SqlDbType.DateTime))
            maCmd.Parameters.Add(New SqlParameter("@date_fin", SqlDbType.DateTime))
     
            maCmd.Parameters("@date_debut").Value = LundiDuJour
            maCmd.Parameters("@date_fin").Value = DateDuJourPlusNbSem
     
            maCmd.ExecuteNonQuery()
     
            Try
                Dim curseur As SqlDataReader = maCmd.ExecuteReader
                Dim DataS As DataSet()
     
                curseur.Close()
            Catch ex As Exception
     
            End Try
     
     
        End Sub
    Je continue met recherche.

    Si quelqu'un à une idée je suis preneur.

    ++

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    il faut bien connaitre les différents objets de base de données pour savoir lequel te convient le mieux

    le datareader sert à extraire des données, pas de stockage
    le datatable sert à stocker des données
    le dataset sert à stocker des données et les remettre dans la base après modification sans avoir grand chose à coder
    le dataadapter sert à remplir un datatable ou un dataset via l'instruction Fill et à faire les requetes pour répercuter les modifs sur la base (pour le dataset je pense)

    tu peux aussi stocker tes valeurs dans des collections de type objet correspondant à ta table en base
    c'est en théorie le plus performant, datatable et dataset ne sont pas très performant

    sinon tu peux aussi regarder linq to sql ou entity framework

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    J'ai essayer en utilisant un tableau d'une structdef :
    Définition de ma structdef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Structure DataEmployeeDailyAssignment
            Dim AssignDate As Date
            Dim contracted_Time As Double
            Dim Schedule_Desc As String
            Dim Schedule_Abbr As String
            Dim D_Schedule_Abbr As String
            'concaténation nom prénom de l'utilisateur
            Dim Ressource As String
            Dim Maitrise As String
            Dim Secteur As String
            Dim Matricule As String
            Dim Contrat As String
    End Structure
    Définition de mon tableau de structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public tabInfoEmployee() As DataEmployeeDailyAssignment = New DataEmployeeDailyAssignment() {}
    et remplissage de ma structure

    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
    Public Sub PS_Select_Employee_Production_Daily_Assignment_fct_periode()
            Dim DateDuJour As String
            Dim LundiDuJour As String
            Dim DateDuJourPlusNbSem As String
     
            If dateJ.Text <> "" Then
                DateDuJour = dateJ.Text
            Else
                DateDuJour = DateTime.Now.Date
            End If
     
            LundiDuJour = lundiSemDateJour(DateDuJour)
            DateDuJourPlusNbSem = DatePlusNbSem(LundiDuJour, nbSemaine)
     
            maCmd = maCnx.CreateCommand
            maCmd.CommandType = CommandType.StoredProcedure
            maCmd.CommandText = "PS_Select_Employee_Production_Daily_Assignment_fct_periode"
     
            maCmd.Parameters.Add(New SqlParameter("@date_debut", SqlDbType.DateTime))
            maCmd.Parameters.Add(New SqlParameter("@date_fin", SqlDbType.DateTime))
     
            maCmd.Parameters("@date_debut").Value = LundiDuJour
            maCmd.Parameters("@date_fin").Value = DateDuJourPlusNbSem
     
            maCmd.ExecuteNonQuery()
     
            Try
                Dim curseur As SqlDataReader = maCmd.ExecuteReader
     
                While (curseur.Read())
                    ReDim Preserve tabInfoEmployee(UBound(tabInfoEmployee) + 1)
                    tabInfoEmployee(UBound(tabInfoEmployee)).AssignDate = curseur.GetDateTime(0)
                    tabInfoEmployee(UBound(tabInfoEmployee)).contracted_Time = curseur.GetDouble(1)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Contrat = curseur.GetString(2)
                    tabInfoEmployee(UBound(tabInfoEmployee)).D_Schedule_Abbr = curseur.GetString(3)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Maitrise = curseur.GetString(4)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Matricule = curseur.GetString(5)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Ressource = curseur.GetString(6) + curseur.GetString(7)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Schedule_Abbr = curseur.GetString(8)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Schedule_Desc = curseur.GetString(9)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Secteur = curseur.GetString(10)
                End While
                curseur.Close()
            Catch ex As Exception
                MsgBox("erreur retournée : " & ex.ToString)
            End Try
     
     
        End Sub
    Cependant ca semble coincer, à savoir que la requete me renvoie 27902 lignes de réponse.

    Je voulais savoir si le datatable serai capable de pallier ce problème.

    Le DataSet ne me sera pas utile car je n'ai pas besoin d'insérer d'information dans la base, j'ai juste à en stocké pour de l'affichage ou du calcule.

    Cependant que ca soit un datatable ou un dataSet je ne sais pas comment récupérer les lignes de réponse de la requête. Est-ce toujours avec un sqlReader?
    [edit : je viens de relire ta réponse concernant le dataadapter]

    Sinon je pense que je vais devoir diviser mes requêtes pour récuperer les infos en plusieurs fois.

    Faut que je trouve déjà comment alimenter le datatable à partir d'un résultat de requete.

    Je continue mes recherches.

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 21
    Points : 23
    Points
    23
    Par défaut alimenter un dataset depuis un sqldatareader
    pour manipuler le resulat d'un datareader
    tu boucle sur les éléments de reader et tu les stocke c'est tout sans passer par un dataset

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    Je viens de refaire un test avec ma méthode :

    Donc j'obtiens ce message d'erreur :

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x10626e0 au contexte COM 0x1062850 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
    Cependant j'avais pas fait gaffe mais il y a un bouton continuer dans la fenetre de ce message d'erreur, j'ai donc cliqué dessus et il semble finaliser la récupération des lignes de résultats de ma requête.

    Je me pose quand même une question concernant l'appli finale comment cela pas apparaitre à l'utilisateur, plantage de l'appli?

    pour manipuler le resulat d'un datareader
    tu boucle sur les éléments de reader et tu les stocke c'est tout sans passer par un dataset
    Récupérer les données ne me pose pas de soucis. Le soucis vient cependant de la quantité de donner à récupérer. Et c cette grande quantité de donnée qui me pose problème . (cf mon code)

    Bon sinon je continue a regarder pour les datatable et voir comment les utiliser.

    ++

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    je te conseille de lire un tuto comme celui ci
    http://plasserre.developpez.com/cours/vb-net/

    les tableaux c'est pas conseillé, c'est pas lisible et des redim preserve c'est pas performant


    tu peux faire ton traitement dans un thread séparé pour pas que le temps de lire les données ne bloque l'interface utilisateur (voir thread ou backgroundworker)
    à savoir que le datatable sera plus long qu'une collection de classe (et non un tableau de structure ^^)

    enfin dnas le tuto y a tout ca je pense ...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je viens de relire pour la nième fois le cours de plasserre.

    Cependant je n'ai pas trouver d'élément concernant l'utilisation d'un DataAdapter avec l'utilisation des procédure stockée. Il y a bien un exemple, mais il s'agit d'un exemple avec un command string :

    XVII-E-2. Utilisation du DataSet, du DataView : en pratique

    Les extraits (snippets) de VB 2005, donne un exemple de code plus condensé pour ouvrir un DataSet:

    Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0; _
    Data Source=AccessFile.mdb;Persist Security Info=False"

    Dim cmd As String = "Select * from Topics"

    Dim adapter As New OleDbDataAdapter(cmd, conn)

    Dim topics As New Data.DataSet

    adapter.Fill(topics)

    Concernant les thread je pense que je vais être obligé de les utilisé pour ces traitement long.

    une collection de classe (et non un tableau de structure ^^)
    euh la je n'ai pas bien compris . J'utilise pourtant un tableau d'un type structuré.

    J'avais essayé avec les collections mais je ne vois pas comment lui faire géré des ensembles d'élément de type différent.

    voila voila

    ++

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    au lieu de public structure, public class c'est en général mieux (attention toute fois ca ne fonctionne pas pareil il faut ensuite un new pour avoir une instance)
    et au lieu de public tab() as machin faire public mesmachins as new system.collections.generic.list(of machin)
    ensuite du peux faire .add au lieu d'un redim preserve et tab(i)
    tu peux accéder à un element comme avec un tableau mesmachins(numero)
    et les collections je pense qu'ils en parlent dans le tuto


    pour ce qui est des procédures stockées, si tu veux récupérer des données il faut que celle ci se termine par un select et après ca fonctionne comme une requete select dans vb

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    ah je comprend l'histoire des collections de classes (ou plutot d'objet en faite), je vais essayer de le traduire depuis ce que j'ai fait.

    Mais je me demande si c réellement utile de faire un classe qui ne comportera que des données membres pour récupérer des résultats de requête.

    Par contre ca apportera peut-être un peu plus de clarté dans le code?

    La method .add d'une collection est plus performante qu'un redim preserve?

    encore merci pour ta réponse.

    pour ce qui est des procédures stockées, si tu veux récupérer des données il faut que celle ci se termine par un select et après ca fonctionne comme une requete select dans vb
    Uhm la j'avoue que j'ai rien compris.

    actuellement mes procedures stockées sont comme suis :

    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
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
     
    ALTER PROCEDURE [dbo].[PS_select_date_fct_periode] 
    	-- Add the parameters for the stored procedure here
     
    	@date_debut as datetime,
    	@date_fin as datetime
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
    	-- Insert statements for procedure here
    	SELECT DISTINCT ASSIGNMENT_DATE 
    	FROM DAILY_SCHEDULE_ASSIGNMENT
    	WHERE ASSIGNMENT_DATE BETWEEN @date_debut AND @date_fin	   
    	ORDER BY ASSIGNMENT_DATE ASC		   
    END
    je ne comprend pas l'histoire du select à rajouter à la fin.

    as-tu un exemple d'utilisation du dataadapter avec une procedure stockée??

    ++

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    faire de la programmation objet dans un langage fait pour c'est quand meme mieux (donc des collections et des classes plutot que des tableaux)
    entre structure et classe il n'y a pas énormément de différences d'utilisation ni de performance, mais je conseillerais quand meme les classes
    le but est entre autre de rendre le code plus lisible et y a des chances pour

    pour ce qui des perf entre un redim preserve ou un collection.add, on va environ 100x plus vite avec une collection (chiffre pas inventé)


    et pourquoi faire une procédure stockée qui contient seulement une requete, tu pourrais appeler cette requete directement depuis ton programme
    à l'origine une procédure stockée ca sert à faire un traitement
    bienqu'il soit possible comme je le disais de récupérer des données de celle ci si la dernière instruction est un select (ce qui est ton cas)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    faire de la programmation objet dans un langage fait pour c'est quand meme mieux (donc des collections et des classes plutot que des tableaux)
    entre structure et classe il n'y a pas énormément de différences d'utilisation ni de performance, mais je conseillerais quand meme les classes
    le but est entre autre de rendre le code plus lisible et y a des chances pour
    ouaip tout à fait d'accord.

    pour ce qui des perf entre un redim preserve ou un collection.add, on va environ 100x plus vite avec une collection (chiffre pas inventé)
    Je viens de faire un test mais ca merdouille encore.
    L'un des premier problème que j'ai rencontré et que lorsque que je modifier l'instance de mon objet et que j'ajoutais le resultat à ma collection ca modifier toute les autres que j'avais inséré avant. Je pense que ca venait du fait qu'il faisait référence à la même instance de mon objet.

    Je reinstancie donc un nouvelle objet a chaque tour de boucle avant de récupérer les informations puis de les stocker dans ma collection :

    Ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class DataEmployeeDailyAssignment
        Public AssignDate As Date
        Public contracted_Time As Double
        Public Schedule_Desc As String
        Public Schedule_Abbr As String
        Public D_Schedule_Abbr As String
        'concaténation nom prénom de l'utilisateur
        Public Ressource As String
        Public Maitrise As String
        Public Secteur As String
        Public Matricule As String
        Public Contrat As String
    End Class
    déclaration de mes objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public InfoEmploy As DataEmployeeDailyAssignment
    Public collInfoEmploy As New System.Collections.Generic.List(Of DataEmployeeDailyAssignment)
    alimentation de la collection

    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
     Try
                'adapter.SelectCommand = maCmd
     
                Dim curseur As SqlDataReader = maCmd.ExecuteReader
     
                While (curseur.Read())
                    InfoEmploy = New DataEmployeeDailyAssignment
                    InfoEmploy.AssignDate = curseur.GetDateTime(0)
                    InfoEmploy.contracted_Time = curseur.GetDouble(1)
                    InfoEmploy.Schedule_Desc = curseur.GetString(2)
                    InfoEmploy.Schedule_Abbr = curseur.GetString(3)
                    InfoEmploy.D_Schedule_Abbr = curseur.GetString(4)
                    InfoEmploy.Ressource = curseur.GetString(5) & curseur.GetString(6)
                    InfoEmploy.Maitrise = curseur.GetString(7)
                    InfoEmploy.Secteur = curseur.GetString(8)
                    InfoEmploy.Matricule = curseur.GetString(9)
                    InfoEmploy.Contrat = curseur.GetString(10)
                    collInfoEmploy.Add(InfoEmploy)
                End While
                curseur.Close()
            Catch ex As Exception
                MsgBox("erreur retournée : " & ex.ToString)
            End Try
    Mais la le truc par en sucette, je n'ai même plus le message avec l'histoire du CLR. Par contre j'ai vu un truc avec l'espion, c qu'il a déjà reservé la taille dans la collection avant d'y avoir ajouté les informations.

    Concernant les threads, je ne pourrais pas les utiliser dans mon cas, en effet je ne peux pas continuer le traitement tant que je n'ai pas récupéré les informations. Or les threads s'utilise dans le cas de traitement parallèle.

    Par contre j'ai trouve un bout de code avec les dataset et les procédures stockées.Il faut que je le test, je reposterai quand j'aurai testé.

    J'utilise les procédures stockées dans mon cas pour bien cloisonner mon code. Ainsi je n'ai pas de SQL dans mon code vb, et quand je veux modifier / créer une requete je ne travaille que sur "Microsoft SQL Server Management Studio Express ".

    ++

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    Citation Envoyé par narutobaka Voir le message
    Je pense que ca venait du fait qu'il faisait référence à la même instance de mon objet.

    Je reinstancie donc un nouvelle objet a chaque tour de boucle avant de récupérer les informations puis de les stocker dans ma collection :
    oui il faut bien faire un new pour avoir un nouvel objet

    Citation Envoyé par narutobaka Voir le message
    Mais la le truc par en sucette, je n'ai même plus le message avec l'histoire du CLR. Par contre j'ai vu un truc avec l'espion, c qu'il a déjà reservé la taille dans la collection avant d'y avoir ajouté les informations.
    pas compris
    une collection n'a pas de taille prévue à l'avance, y a seulement une capacité de départ, et quand on dépasse cette capacité, ca réalloue de l'espace avec le double de capacité (m'enfin ca y a pas trop besoin de s'en occuper
    le nombre de choses dans une collection s'obtient avec .count (qui vaut 0 au départ)

    Citation Envoyé par narutobaka Voir le message
    Concernant les threads, je ne pourrais pas les utiliser dans mon cas, en effet je ne peux pas continuer le traitement tant que je n'ai pas récupéré les informations. Or les threads s'utilise dans le cas de traitement parallèle.
    si du déporte tout ton traitement dans un autre thread le traitement sera bien linéaire, il n'y aura rien de parallélisé

    de touter facon dès que tu dois écrire un traitement de plusieurs secondes, il faut passer sur un autre thread sinon l'interface freeze et l'utilisateur risque de faire fin de tache ...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Bon j'ai reréfléchit mon problème ce week end.

    Je récupère d'une part les utilisateurs de la production.

    Ensuite je récupèrerai pour chaque utilisateur la liste de leur jour d'assignation, ce qui fera ainsi moins de ligne de résultat à récupérer en une fois.

    si du déporte tout ton traitement dans un autre thread le traitement sera bien linéaire, il n'y aura rien de parallélisé

    de touter facon dès que tu dois écrire un traitement de plusieurs secondes, il faut passer sur un autre thread sinon l'interface freeze et l'utilisateur risque de faire fin de tache ...
    J'avais essayé de le faire mais il continu mon programme principale en même temps que le thread alors que le programme principale à besoin du résultat du traitement effectué dans le thread pour continué. Je met pour l'instant le traitement dans le thread de coté je reviendrai dessus plus tard.

    Je continue à chercher pour l'utilisation des dataadapter.

    ++

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    ca y est je crois avoir trouver comment utiliser les dataadapter. J'ai trouvé la base de mon bonheur sur ce post :
    http://www.developpez.net/forums/d33...edure-stockee/

    et je l'ai modifier à ma sauce :

    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
     Public Sub PS_Select_Employe_Production_fct_Periode()
            Dim DateDuJour As String
            Dim LundiDuJour As String
            Dim DateDuJourPlusNbSem As String
            Dim monDataAdapter As New SqlDataAdapter
            Dim monDataSet As New DataSet
            Dim maDataTable As New DataTable
     
            'Dim dtBaseActive As DataTable = New DataTable
            'Dim adapter As OleDbDataAdapter
     
            If dateJ.Text <> "" Then
                DateDuJour = dateJ.Text
            Else
                DateDuJour = DateTime.Now.Date
            End If
     
            LundiDuJour = lundiSemDateJour(DateDuJour)
            DateDuJourPlusNbSem = DatePlusNbSem(LundiDuJour, nbSemaine)
     
            Using maCnx
                maCmd = maCnx.CreateCommand
                maCmd.CommandType = CommandType.StoredProcedure
                maCmd.CommandText = "PS_Select_Employe_Production_fct_Periode"
     
                maCmd.Parameters.Add(New SqlParameter("@date_debut", SqlDbType.DateTime))
                maCmd.Parameters.Add(New SqlParameter("@date_fin", SqlDbType.DateTime))
     
                maCmd.Parameters("@date_debut").Value = LundiDuJour
                maCmd.Parameters("@date_fin").Value = DateDuJourPlusNbSem
     
                monDataAdapter.SelectCommand = maCmd
                monDataAdapter.Fill(maDataTable)
            End Using
             'parcourt et récupération des données du dataTable
            For ligne = 0 To maDataTable.Rows.Count - 1
                InfoEmploy = New DataEmployee
                InfoEmploy.Id_Employee = maDataTable(ligne)(0)
                InfoEmploy.Ressource = maDataTable(ligne)(1) & " " & maDataTable(ligne)(2)
                InfoEmploy.Maitrise = maDataTable(ligne)(3)
                InfoEmploy.Secteur = maDataTable(ligne)(4)
                InfoEmploy.Matricule = maDataTable(ligne)(5)
                InfoEmploy.Contrat = maDataTable(ligne)(6)
                collInfoEmploy.Add(InfoEmploy)
            Next
     
        End Sub
    Voila voila si ca peut aider quelqu'un.

    Bon me reste a gérer le problème thread.

    ++

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Petite remarque sur mon code précédent : il faut faire attention au "End Using".

    En effet ce dernier semble couper la connexion et vider la chaine de connection.
    Conséquence il faut relancer la connexion après un "end using" afin de pouvoir faire de nouvelle requête.

    Je ne sais pas si mon code est correcte. Si qqn a une remarque dessus.

    Sinon j'ai réussit à mettre en place un thread, le cours de Mr. Plassere étant trés utile avec toute les ptites astuces qui m'ont permis de réglé mon précédent essais avec les threads, comme la remarque :

    Par contre les objets de l'interface (du thread principal) ne sont pas accessibles dans le thread d'arrière plan:
    vrai ptite mine d'or ce cours pour les threads c ici :

    http://plasserre.developpez.com/cour...-forms5#LX-R-1

    Par contre comme pour mon précedent test sur les threads, même lorsqu'il rentre dans le thread il continue le traitement principale en parallèle et ca me pose problème car le traitement principale à besoin des résultats des traitements du thread pour continuer le traitement et la il continue sans d'ou un beau plantage.

    Je voulais savoir si il y avait moyen de bloquer un processus principale et de le reprendre suite au thread.

    Quoi qu'il en soit il faut que je revoit ma succession de traitement. Parce qu'en fin de compte le gros de mon appli et un "gros" processus de traitement.

    ++

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    using end using sert à appeler .dispose automatiquement en sortie de bloc
    dispose sur une connexion la ferme et la détruit en mémoire, donc normal qu'elle soit ensuite inutisable

    de toute facon c'est conseillé d'utiliser une nouvelle connexion à chaque requete, et de la fermer à la fin de l'utilisation


    pour ce qui est des threads, on peut en effet bloquer le thread principal, mais ca va bloquer l'interface
    le truc c'est que c'est à toi de gérer par code ce que tu veux faire
    il faut déplacer ton traitement dans une sub qui sera appelée à la fin du thread, comme elle ne sera exécutée qu'à la fin du traitement

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    bon et bien après qq test, j'ai redécoupé mon traitement comme suis :

    I. Récupération des variables de traitement :

    - Dates
    - Chemin du fichier excel à générer

    II. Thread

    - Requête
    - Stockage des données
    - Calcules sur les données

    III. Fin du thread « BackgroundWorker1_RunWorkerCompleted »

    - Parcourt des données
    - Création du fichier excel

    Cela semble fonctionner et en même temps ca parait plus clair.

    Je suis preneur de toute remarque

    ++

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    Tu as répondu pendant que je rédigeais mon précédent message .

    using end using sert à appeler .dispose automatiquement en sortie de bloc
    dispose sur une connexion la ferme et la détruit en mémoire, donc normal qu'elle soit ensuite inutisable

    de toute facon c'est conseillé d'utiliser une nouvelle connexion à chaque requete, et de la fermer à la fin de l'utilisation
    Je ne connaissais pas cette méthode, donc j'ai fait une trace pas à pas pour voir que end using supprimait la chaine de connexion.

    Si tu as de la documentation dessus je suis preneur car je n'ai rien trouvé sur cette élément dans le cours de Mr. Plasserre.

    Concernant les threads j'ai répondu avec mon redécoupage dans le précédent post qu'en penses tu ?

    ++

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 122
    Points
    25 122
    Par défaut
    je sais pas niveau code mais ca la démarche est propre

    pour ce qui est de using, il est recommandé pour tout ce qui est disposable
    que tu sortes pas le end using, ou que ca sorte avant à cause d'une erreur, dispose est appelé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using f as new form
      'traitement nécessitant f
    end using
    correspond à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      dim f as new form
      ' traitement nécessitant f
    finally
      if f isnot nothing then f.dispose
    end try
    je t'invite à voir le fonctionne de try si tu ne le connais pas, on peut faire try catch, try finally ou try catch finally
    en cas d'erreur, ca saute dans le catch
    le finally est toujours exécuté, qu'on soit passé en erreur ou non

    pour ce qui est de dispose, .net intègre 2 types de choses en ram, ce qui est managé et non managé
    managé = géré par .net (par la clr plus exactement)

    managé :
    un string, un integer, une collection, une classe contenant que des types managés etc...
    ces choses là quand tu les utilises plus, elles sont marqués comme plus utilisés et le garbage collector (appelé GC) effacera la mémoire qu'ils prenaient automatiquement (mais pas immédiatement)

    non managé :
    certaines classes utilisent des choses non managés comme les controles, les forms, les connexions aux bases de données, les images, fonts, brushes etc ...
    les images par exemple (system.Drawing.image, system.Drawing.bitmap ...) ne sont que des pointeurs vers des images gérées par l'OS
    donc ces classes implémentent l'interface IDisposable et la méthode Dispose
    quand tu instancies une image, ca appelle une dll de windows pour lui dire de créée l'image et son espace mémoire
    quand tu appelles la méthode dispose, ca appelle une dll de windows qui libère (immédiatement) la mémoire gérée par l'OS (une partie de la mémoire de ces classes est quand meme gérée par .net comme les propriété width et height, c'est le GC qui s'en occupe)
    les connexions c'est pareil, c'est pas codé en .net mais en COM

    (pour info une grosses partie du framework est codée en .net, le reste c'est souvent de l'appell d'API (= dll de windows))
    si tu oublies d'appeler dispose, le GC le fera mais c'est quand meme conseillé de le faire soi meme

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    J'utilisais déjà le try catch pour la gestion des erreurs.

    Par contre je ne savais pas qu'il existait comme en java un garbage collector.

    Merci pour ton explication sur la mémoire managé et non managé c toujours bon à connaitre.

    j'ai étais jeté un coup d'oeil sur la description du using :

    http://msdn.microsoft.com/fr-fr/libr...hh(VS.80).aspx

    Bon bah j'ai plus qu'a finir de coder

    en tout cas un énorme merci pour ton énorme aide et tes aiguillages.

    ++

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Win32] Retourner un dataset depuis un Web Service
    Par romstarr dans le forum Web & réseau
    Réponses: 2
    Dernier message: 10/05/2008, 17h47
  2. Réponses: 1
    Dernier message: 18/02/2007, 20h28
  3. [VB.NET] Requete dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/10/2005, 13h58
  4. [VB.NET] [ADO.NET] Adapter, TableMapping et DataSet xsd
    Par neo.51 dans le forum Accès aux données
    Réponses: 14
    Dernier message: 23/09/2004, 16h52
  5. [VB.NET] Alimenter un dataset avec une chaine XML...
    Par David.V dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2004, 09h09

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