Hej,DataReader och öppna connections
Jag vet att det här har tagits upp tidigare, men jag får ingen rätsida på det.
Jag har länge använt ett Data Access-lager som returnerade hela DataSets hela tiden. D.v.s öppnade en anslutning, läste in datan i minnet på servern, och stängde anslutningen.
Men jag har nu byggt om mitt "standard" Data Access-lager lite. Jag läste här på pellesoft en diskussion där fördelar och nackdelar med datasets respektive datareaders togs upp. Någon menade att Readers borde returneras och sedan användas för att hämta datan, medan någon annan menade att readern aldrig bör vandra mellan lagren. Detta gjorde att jag bytte åsikt, "varför använda datasets; det är ju som att ha hela databastabellen i RAM-minnet, måste ju vara smidigare att läsa in ett värde i minnet åt gången".
Nu returnerar jag alltså DataReaders istället. Min fråga är nu: hur vet jag om en anslutning stängs korrekt? Min gissning är att följande kod stänger readern själv:
grdView.DataSource = MittDataAccessLager.MinTabell.ReturnReader()
grdView.DataBind()
Detta eftersom jag inte har deklarerat någon DataReader; den existerar väl egentligen bara på kodraden som returnerar den? Sen ligger den väl i datakällan?
Men att följande kod håller den öppen?:
Dim DR As SqlDataReader = MittDataAccessLager.MinTabell.ReturnReader()
grdView.DataSource = DR
grdView.DataBind()
Eftersom datareadern nu ligger BÅDE i datakällan OCH i objektet DR.
Det ser iallafall ut så när jag tittar på Activity Monitorn i SQL Server. Där visas alltid en process, med det senaste kommandot som kördes. Det försvinner om man väntar några minuter. Men det försvinner ALDRIG även om jag "explicit" stänger alla DataReaders. Det gör ingen skillnad. Kollar jag på fel ställe? Är mina readers (och därmed anslutningar) öppna om jag kodar som i första exemplet?