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

Windows Forms Discussion :

Manipuler des objets d'une fonction public


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Manipuler des objets d'une fonction public
    Bonjour à tous!

    J'ai une fonction cosql qui me permet de mettre le résultat d'une reqûete dans un tableau spécifié préalablement.

    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
     
    Public Function cosql(ByRef sqlcmd As String, ByRef T(,) As String) As Boolean
            Dim dbco As OleDbConnection
            Dim dbdr As OleDbDataReader
            Dim dbcmd As OleDbCommand
            Dim i, j As Integer
            j = 0
            dbco = New OleDbConnection(ConnectionString)
            dbco.Open()
            dbcmd = New OleDbCommand(sqlcmd, dbco)
            dbdr = dbcmd.ExecuteReader
            ReDim T(dbdr.VisibleFieldCount - 1, 0)
            While dbdr.Read()
                For i = 1 To dbdr.VisibleFieldCount
                    If Not VarType(dbdr(i - 1)) = VariantType.Null Then
                        T(i - 1, j) = ReQuote(dbdr(i - 1))
                    Else
                        T(i - 1, j) = "0"
                    End If
                Next i
                j = j + 1
                ReDim Preserve T(dbdr.VisibleFieldCount - 1, j)
            End While
            T(0, j) = "EOF"
            dbdr.Close()
            dbco.Close()
            dbco.Dispose()
            dbco = Nothing
            dbdr = Nothing
            dbcmd = Nothing
            i = Nothing
            j = Nothing
    End Function
    Le probléme c'est qu'en faisant de la sorte, je n'arrive pas à faire une reqûete parametrée, car il faudrait que je puisse ajouter des parametres selon chaque cas (étant donné que la chaine arrive déja telle qu'elle, sans savoir ce qui est authentique de ce qui a pu être injecté).

    Est il possible, depuis une autre fonction, de faire quelquechose de semblable à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    With cosql().dbcmd.Parameters
                .AddWithValue("@test1", test1)
                .AddWithValue("@test2", test2)
                .AddWithValue("@test3", test3)
    End With
    'Et appeller ma fonction:
    cosql("SELECT ville_id, lib_ville FROM VILLE WHERE lib_ville in (@test1,@test2,@test3", t_ville)

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ca doit surement etre possible mais il y a plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function cosql (ByRef sqlcmd As String, ByRef T(,) As String, paramarray params() as dbparamters)
     
      for each p as dbparameter in dbparamters 
    '    les ajouter au cmd
    ensuite tu peux appeler la fonction avec de 0 à n parameters derrière, ou alors meme en tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim p1 as new dbparameter("nom",type).value = valeur
    dim p2 as new dbparameter("nom",type).value = valeur
    cosql("rq",tRetour,p1,p2)
    si tu veux faire les choses mieux il faudrait créé des classes de stockage plutot qu'un vulgaire tableau
    genre une classe Tab avec une collection de colonnes, une collection de ligne
    et éventuellement la possibilité de demander une valeur pour une ligne et une colonne avec soir le numéro de colonne, soit son nom, soit son instance et dans ce cas cas tu peux faire un classe colonne avec les infos de la base (nom de la table, nom du champ, type de données, valeur par défaut etc...)

    de plus avec des collections tu auras environ 100x plus de performances qu'avec un redim preserve (donc 1s au lieu de 100s pour le temps d'exécution)

    j'ajouterais aussi
    - ta fonction n'a pas de try catch, or une connexion à une base ca peut planter, une requete ca peut etre mal écrit
    - mettre des objets à nothing ca sert à rien à part faire des lignes de code et donc rendre le code moins lisible
    - mettre les dispose c'est bien mais avec using / end using c'est mieux, parce que là si y a une erreur sur la requete, ca plante et donc la connexion n'est pas disposé (enfin si mais surement beaucoup plus tard)
    - close puis dispose ca sert à rien non plus, dispose fait le close s'il n'a pas été fait
    - le reader ca se dispose aussi

    donc la démarche d'encapsuler l'accès aux données c'est bien mais il reste un peu à potasser
    un cours ici : http://plasserre.developpez.com/cours/vb-net/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Merci pour la rapidité de ta réponse!
    Merci aussi pour tous tes conseils, j'commence juste le developpement en général donc c'est vraiment le genre de choses que j'attendai!

    Je peux pas étudier ça dans l'immédiat, je regarde un peu tout ça ce soir!

    Pour les dispose je ne savais pas qu'ils encapsulaient le close, et pour le nothing j'ai lu ça sur le net je ne sais plus ou, pour être sure de libérer la mémoire utilisée par la variable.

    Merci encore pour la réponse.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    comme je disais ca reste à potasser, il faut connaitre l'outil pour savoir quoi écrire ou non

    pour le dispose qui appelle close, on peut le voir grace à reflector, ca se devine pas ...

    pour les variables mises à nothing, ca sert à rien une variable est mise à nothing en sortie de bloc
    quand tu fais un dim dans une fonction une sub ou autre, c'est automatiquement mis à nothing à la sortie de la sub (pour une variable dimmée dans un for, à la sortie du for elle est mise à nothing etc...)
    après il y a des langages où il faut le faire explicitement, mais c'est pas le cas ici, il y d'ailleurs un garbage collector en .net qui s'occupe de vider la mémoire (bon à savoir)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [1.x] [Propel]Manipulation des objets et appel des fonctions
    Par Djillian dans le forum Symfony
    Réponses: 5
    Dernier message: 03/03/2011, 17h22
  2. Manipulation des objets dans une session
    Par facilus68 dans le forum Hibernate
    Réponses: 5
    Dernier message: 28/12/2007, 14h02
  3. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  4. Réponses: 13
    Dernier message: 09/05/2006, 16h30
  5. fonction récupérant des valeurs dans une fonction popup...
    Par petitsims dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2005, 14h51

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