SqlDataReader eccezione

di il
11 risposte

SqlDataReader eccezione

Ho necessità di leggere i records di una tabella SqlServer in un ciclo While ed al suo interno aprire e leggere una seconda tabella. Sto utilizzando il codice seguente:
StringaSql = "Select * FROM Mc3_CategWeb1 order by Descrizione"
Dim cmd As New SqlCommand(StringaSql, sql)

Try
Dim Rec1 As SqlDataReader = cmd.ExecuteReader
While Rec1.Read()
StringaSql = "Select * FROM Mc3_CategWeb2 where Codice Like '" + Rec1.GetString(0) + "*' order by Descrizione"
Dim cmd2 As New SqlCommand(StringaSql, sql)
Dim Rec2 As SqlDataReader = cmd2.ExecuteReader
While Rec2.Read()
TreeView1.Nodes(0).Nodes.Add(Trim(Rec2.GetString(0)), Trim(Rec2.GetString(1)))
End While
Rec2.Close()
cmd2.Cancel()
End While
Rec1.Close()
Finally
sql.Close()
End Try
Ma durante l'apertura della seconda tabella appare l'eccezione seguente e non so come risolvere:
"There is already an open DataReader associated with this Command which must be closed first"

11 Risposte

  • Re: SqlDataReader eccezione

    Fai un comando unico mettendo in Join le due tabelle, tiri fuori i 2 campi che ti servono (così togli gli asterischi "*" che non appesantiscono solo) e cicli i SqlDataReader una volta sola.

    Usa il TAG CODE per il codice, che rende tutto più leggibile.
  • Re: SqlDataReader eccezione

    Grazie ma purtroppo non posso gestirla cosi.
    Ma non è possibile aprire due o più tabelle in un ciclo While? Mi sto approcciando ora a VbNet e non trovo documentazione in rete che mi risolva l'eccezione...mi sarebbe utile uno stralcio di codice anche stravolgendo il mio ovviamente, l'importante è riuscire ad aprire due tabelle in un ciclo while.
  • Re: SqlDataReader eccezione

    Scoz72 ha scritto:


    Ma non è possibile aprire due o più tabelle in un ciclo While? Mi sto approcciando ora a VbNet e non trovo documentazione in rete che mi risolva l'eccezione...mi sarebbe utile uno stralcio di codice anche stravolgendo il mio ovviamente, l'importante è riuscire ad aprire due tabelle in un ciclo while.
    Generalmente non è possibile aprire più di un DataReader sulla medesima connessione.

    Per risolvere, puoi creare più connessioni separate allo stesso DB usando la stessa ConnectionString, oppure provare a modificare la stessa stringa di connessione per abilitare MARS (aggiungendo MultipleActiveResultSets=True ai parametri elencati nella stringa).

    Ciao!
  • Re: SqlDataReader eccezione

    Spiega perché non puoi usare la JOIN

    Comunque per MARS leggi

    https://docs.microsoft.com/it-it/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets
  • Re: SqlDataReader eccezione

    oregon ha scritto:


    Spiega perché non puoi usare la JOIN

    Comunque per MARS leggi

    https://docs.microsoft.com/it-it/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets
    E' un pò complicato da spiegare, devo scorrere i records della prima tabella e per ogni record devo ricercare nella seconda tabella i records correlati per poi caricarli (concatenando dei campi) in una TreeView. Ma comunque la mia esigenza, mi capita spesso di doverlo fare, è quella di poter aprire più tabelle. Quindi mi dite che non esiste altro metodo (a parte MARS) se non quello di aprire più connessioni al database? Neanche utilizzando altri sistemi?
    Scusate ma sono un neofita di VbNet e con Vb6 potevo aprire mille tabelle con la stessa connessione al database.
  • Re: SqlDataReader eccezione

    Scoz72 ha scritto:


    Quindi mi dite che non esiste altro metodo (a parte MARS) se non quello di aprire più connessioni al database?
    Neanche utilizzando altri sistemi?
    Non vedo il problema nell'aprire due connessioni, ma ne vedo ancora meno nell'aggiungere un flag a una stringa di connessione.
    Meno di così...
  • Re: SqlDataReader eccezione

    Alka ha scritto:


    Scoz72 ha scritto:


    Quindi mi dite che non esiste altro metodo (a parte MARS) se non quello di aprire più connessioni al database?
    Neanche utilizzando altri sistemi?
    Non vedo il problema nell'aprire due connessioni, ma ne vedo ancora meno nell'aggiungere un flag a una stringa di connessione.
    Meno di così...
    Non è un problema, infatti l'ho fatto e funziona...mi chiedevo solo se esistesse un metodo diverso.
  • Re: SqlDataReader eccezione

    Scoz72 ha scritto:


    ... devo scorrere i records della prima tabella e per ogni record devo ricercare nella seconda tabella i records correlati ...
    Una Join, appunto.
  • Re: SqlDataReader eccezione

    grumpy ha scritto:


    Scoz72 ha scritto:


    ... devo scorrere i records della prima tabella e per ogni record devo ricercare nella seconda tabella i records correlati ...
    Una Join, appunto.
    In effetti, se non si utilizzano gli strumenti appositi, poi è ovvio che si incontrano difficoltà ...
  • Re: SqlDataReader eccezione

    Scoz72 ha scritto:


    Non è un problema, infatti l'ho fatto e funziona...mi chiedevo solo se esistesse un metodo diverso.
    Se ce ne fossero stati altri, te li avrei suggeriti assieme ai primi.
  • Re: SqlDataReader eccezione

    Va bene grazie, siete stati gentilissimi e scusate ancora.
Devi accedere o registrarti per scrivere nel forum
11 risposte