Toon posts:

[ASP.NET] ExecuteReader Probleem

Pagina: 1
Acties:
  • 598 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik probeer op 1 pagina in de page_load sub 2 datagrids te vullen en dat lukt niet :p

Foutmelding is:
Voor ExecuteReader is een open en beschikbare verbinding vereist. De huidige status van de verbinding is Open, Fetching.

Op regel 26
dgKapot.DataSource = Cmd.ExecuteReader

En dit is me code:
code:
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
   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Con As OleDbConnection
        Dim Cmd As OleDbCommand
        Dim Dr As OleDbDataReader
        Con = New OleDbConnection(GetDNS())

        'Open connection
        Con.Open()

        'Create cmd
        strSQL = "SELECT * FROM Comps"
        Cmd = New OleDbCommand(strSQL, Con)

        'Read data
        Dr = Cmd.ExecuteReader
        dgComps.DataSource = Dr

        'Fill the dg
        dgComps.DataBind()
        Dr.Close()

        '*********************************************
        strSQL = "SELECT Mhz, Mem, Reden FROM Kapot, Comps WHERE Comps.Id = Kapot.CompId"
        Cmd = New OleDbCommand(strSQL, Con)
        Dr = Cmd.ExecuteReader
        dgKapot.DataSource = Cmd.ExecuteReader

        'Close connection
        Con.Close()
    End Sub


Kan iemand mij vertellen wat ik fout doe :)

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Hmm...

Volgens mij komt dit omdat je eerste OleDbCommand nog in use is (Cmd dus), bij de 2e keer dat je deze var gebruikt gaat je app dus waarschijnlijk hard crashend plat.

Dit kun je wellicht oplossen door:

- Die eerste Cmd vrij te geven alvorens je m weer gebruikt.
- De 2e variabele voor je OleDbCommand te hernoemen.

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
Je moet zowiezo geen DataReader gebruiken als DataSource voor een datagrid of whatsoever.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op vrijdag 11 februari 2005 @ 14:31:
Je moet zowiezo geen DataReader gebruiken als DataSource voor een datagrid of whatsoever.
Any reason for that? :?

Voor wat betreft wat de topicstarter aangeeft lijkt een en ander me een probleem in een specifieke OleDB-driver implementatiie (geen idee aan wat voor DB hij connect), de constructie die hij geeft is iig met de SqlServer classes gewoon legaal en zou afaik voor de OleDb classes ook gewoon moeten werken.

Professionele website nodig?


Verwijderd

Topicstarter
Ik connect naar een access database :)

Ik had het ookal zonder datareader geprobeerd en dat werkte ook niet, kreeg de zelfde foutmelding, moet ook toegeven dat ik niet precies weet wat een datareader doen :p

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
Omdat een DataReader een connectie exclusief locked.
Omdat je je data dan gewoon een te grote koppeling heeft met je UI.
Voor wat betreft wat de topicstarter aangeeft lijkt een en ander me een probleem in een specifieke OleDB-driver implementatiie (geen idee aan wat voor DB hij connect), de constructie die hij geeft is iig met de SqlServer classes gewoon legaal en zou afaik voor de OleDb classes ook gewoon moeten werken.
Volgens mij is het probleem van de topicstarter dat hij 2 readers opent, en die readers maken gebruik van dezelfde connectie. De connectie wordt niet gesloten als hij de 2de reader opent.

Ik denk dat dit het euvel alleszins moet verhelpen:
code:
1
2
3
4
5
6
7
8
conn.Open();
OleDbReader dr = cmdBliep.ExecuteReader();
...
dr.Close();
conn.Close();
...
conn.Open();
OleDbReader dr2 = cmdBlaat.ExecuteReader();

Dus, eerst de connectie sluiten voordat je je 2de reader start. (En daarvoor natuurlijk de connectie ook weer openen.)

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Zoals ik al zeg kun je met de SqlXxx classes gewoon nieuwe readers aan een connection hangen zolang je de vorige reader maar netjes sluit eerst, en dat is gewoon volgens de specs. Er is hier dus iets anders aan de hand :)

Uit de docs:
You must explicitly call the Close method when you are through using the OleDbDataReader to use the associated OleDbConnection for any other purpose.
Dat een DataReader een connectie exclusief lockt is dus een non-argument zolang je de readers netjes direct sluit zodra je ermee klaar bent, en dat het teveel koppelt met de UI... tja, ik heb een hekel aan DAL's die groter zijn dan het project dat je ermee bouwt, beetje het idee van een fabriek speciaal neerzetten om 1 auto te bouwen :)

[ Voor 14% gewijzigd door curry684 op 11-02-2005 15:19 ]

Professionele website nodig?


Verwijderd

Topicstarter
Oke het werkt nu, zonder de connectie te sluiten maar ik moet wel een 2e datareader aan maken en de eerste sluiten :)

Maar als het zonder datareader beter is hoe werkt dat dan?

btw wat is een DAL? :p

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
curry684 schreef op vrijdag 11 februari 2005 @ 15:17:
Zoals ik al zeg kun je met de SqlXxx classes gewoon nieuwe readers aan een connection hangen zolang je de vorige reader maar netjes sluit eerst, en dat is gewoon volgens de specs. Er is hier dus iets anders aan de hand :)
Dat een DataReader een connectie exclusief lockt is dus een non-argument zolang je de readers netjes direct sluit zodra je ermee klaar bent, en dat het teveel koppelt met de UI... tja, ik heb een hekel aan DAL's die groter zijn dan het project dat je ermee bouwt, beetje het idee van een fabriek speciaal neerzetten om 1 auto te bouwen :)
Dan nog kan je het op een andere manier doen (via data-adapter / datatable/set bv).
Feit is dat ik het gewoon eng vind om je reader aan je grid te koppellen.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Data Abstraction Layer :)
whoami schreef op vrijdag 11 februari 2005 @ 15:24:
[...]

Dan nog kan je het op een andere manier doen (via data-adapter / datatable/set bv).
Feit is dat ik het gewoon eng vind om je reader aan je grid te koppellen.
True, tis niet best practice, maar aan de andere kant is het geen halszaak :) Ik populate kleine ListBoxes en DropdownLists wel met readers, maar da's gewoon puur 'for sake of simplicity', voor een grid vind ik het ook wat lomp.

Professionele website nodig?

Pagina: 1