none
uiliser un sqlreader dans une classe en objet RRS feed

  • Question

  • bonjour,

    J'ai créé une classe requete, avec le libelle passé en paramètre. Cette classe aurait donc des attributs SqlConnection, SqlCommand et SqlDataReader. Avec l'espoir donc de récupérer le reader à l'aide d'un accesseur. Mais visiblement, on ne peut pas faire comme ça, ou j'ai fait une erreur quelque part...

    Une âme charitable accepterait peut-être de voler à mon secours ??? A tout hasard, je pose là le code en question. D'abord la classe :

    Public Class requete
            Public libelle As String
            Public connection As SqlConnection
            Public demande As SqlCommand
            Private resultats As SqlDataReader
            'creation objet
            Public Sub New(ByVal texte As StringByVal la_connection As SqlConnection)
                libelle = texte
                connection = la_connection
                demande = New SqlCommand
                resultats = Nothing
            End Sub
            'accessurs et mutateurs
            Public Function get_resultats() As SqlDataReader
                Return resultats
            End Function
            'methodes
            Public Sub remplir()
                connection.Open()
                demande.Connection = connection
                demande.CommandText = libelle
                resultats = demande.ExecuteReader
                connection.Close()
            End Sub
        End Class

    Puis l'algo principal :

    'Recuperer les infos de la base
            MaConnexion.ConnectionString = "Integrated Security=SSPI; database=la_base;server=le_serveur"
            la_requete = New requete("Select * from une_table", MaConnexion)
            la_requete.remplir()
            MesResultats = la_requete.get_resultats
            While MesResultats.Read
                //actions
            End While
            MesResultats.Close()

    Cordialement, guznat.


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    jeudi 4 août 2011 17:18

Réponses

  • bonjour,

    En fait, c'est tout simple! L'ouverture et la fermeture de la connection ne doivent pas se faire au niveau de la classe!!

    cordialement, guznat


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    • Marqué comme réponse guznat jeudi 4 août 2011 17:51
    jeudi 4 août 2011 17:51

Toutes les réponses

  • Bonjour,

    Merci de TOUJOURS indiquer SVP le message d'erreur exact que vous obtenez et d'indiquer sur quelle ligne cette erreur survient (il pourrait y avoir plusieurs erreurs et je m'arrête à la première que je vois par exemple, ou le même code pourrait donner une erreur chez vous mais une autre erreur chez moi ou même s'exécuter sans erreur etc...).

    Pour l'instant je dirais que le problème est que la connexion doit-être fermée après avoir terminé la lecture via le Reader (la lecture est progressive donc la connexion doit-être maintenue jusqu'à la fin). Il y a peut être une confusion avec le DataSet/DataTable qui va effectivement tout charger en mémoire.

    Il y a un  paramètre sur le Reader pour demander à ce que la connexion sous-jacente soit fermée automatiquement lorsque le reader est fermé : voir http://msdn.microsoft.com/fr-fr/library/y6wy5a0f.aspx.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 4 août 2011 17:42
    Modérateur
  • bonjour,

    En fait, c'est tout simple! L'ouverture et la fermeture de la connection ne doivent pas se faire au niveau de la classe!!

    cordialement, guznat


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    • Marqué comme réponse guznat jeudi 4 août 2011 17:51
    jeudi 4 août 2011 17:51
  • Je n'avais pas précisé lle message d'erreur car il n'y en avais pas...

    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    jeudi 4 août 2011 17:52
  • ...Ou de décrire alors le comportement que l'on obtient (la boucle de lecture était quittée immédiatement ?).

    Eventuellement la classe pourrait gérer également la connexion voire les requêtes SQL de façon à pouvoir faire qq chose comme :

    Set qry=New Requete
    Set reader1=Requete.Personnes

    Plus loin...

    Set reader2=Requete.PersonneById(10)

    L'idée étant de ne pas avoir deux endroits dans le code ou l'on instancie une connexion ou deux endroits dans le code ou on tape une même requête SQL.

    Eventuellement à terme étudier peut-être si Entity Framework pourrait être utile. Le but est d'exposer les données de la base sous forme d'objet et cela permet d'écrire qq chose comme :

    Personne=From p In MesDatas.Personnes where p.Nom="Moi"

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 4 août 2011 18:13
    Modérateur