27. januar 2006 - 23:27Der er
12 kommentarer og 1 løsning
Del DB adgang mellem User Control's
Jeg har en masse user controls som bliver inkluderet på en side sammen. Problemet med dem er at for at det virker er at hver af dem åbner og lukker databasen når de bliver loaded.
Jeg inkludere dem med: System.Web.UI.UserControl US = new System.Web.UI.UserControl(); US = (UserControl)US.LoadControl(ControllPath); SitePlaceHolder.Controls.Add(US);
Kan jeg hente min database forbindelse fra den side der kalder control'en når det gøres på denne måde?
Jeg har ligeledes forsøgt mig med nedarvning fra System.web.ui.usercontrol gennem en klasse der ikke har andet en den egenskab der angiver en database forbindelse. Men har ikke fået det til at virke.
Er der nogen af jer der har en god ide til at løse dette, for det giver jo ingen mening at lukke en databaseforbindelse bare for at åbne den igen
Ok...Var lidt hurtig... Fik løst problemet med: (DatabaseConnection.DBConn)this.Parent.NamingContainer.GetType().InvokeMember("GetDB",System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder,this.Parent.NamingContainer,null);
hvor GetDB bare er en funktion der retunere databaseforbindelsen... Men hvis der er nogen der har en nemmere metode, så de velkomne til at sige til
baser dine usercontrols på en base der kan levere dig forbindelser, sådan som du selv gik igang med - det burde ikke skabe nogle problemer.. der må være en detalje i det du har haft lavet der har drillet.
det du har gjort med den kode du har vist er, at du har koblet dine kontroller uløseligt sammen med en namingcontainer der implementerer en specifik metode, og du har gjort det på en måde så compileren aldrig nogensinde vil kunne hjælpe dig med at sikre det.... og hvad nu når du skal wrappe dine kontroller i en anden namingcontainer?
det giver meget fin mening at du holder dine forbindelser åbne så kort tid som overhovedet muligt, så jeg vil anbefale dig at bevare din gamle løsning hvor kontrollerne
åbner suger data lukker
således at dine forbindelser er åbne så kort tid som muligt, og kontrollerne kan "leve" selvstændigt".... (.net har inbygget connectionpooling).
men... hvis du har en stak klasser der allesammen skal hente data i den ene og anden forbindelse, synes jeg da at du skal lave dig et datalag, og så kalde det fra dine kontroller (eller fodre dem med data udefra). så slipper du får at bikse med forbindelser etc. i hver eneste kontrol du har.
principielt er det fint at udføre en dispose når du er færdig med at bruge objekter der implementerer IDisposable - du kan f.eks. benytte dette mønster:
using(MySqlConnection conn = new MySqlConnection(...)) { // brug forbindelsen her }
ovenstående kompilerer til en try/finally, hvor du i din finally får kaldt dispose.
Det gør den vel også med databasen, men man sikre bare at frigi pladser med det samme ik?
Og til aller sidst, et spørgsmål jeg tror er lidt irrellevant... Hvis jeg laver en database forbindelse med: namespace DatabaseConnection { ... public DBConn(String ConnString) { _ConnString = ConnString; Conn = new MySql.Data.MySqlClient.MySqlConnection(ConnString); } ... }
og senere åbner den med en anden funktion. GØr det så nogen foreskel om jeg øverst på en side laver en: DatabaseConnection.DBConn DB; for at kunne tilgå den forskellige steder senere som fx:
DB = new DatabaseConnection.DBConn(...); DB.Open(); ... ... DB.Close();
... ... DB = new DatabaseConnection.DBConn(...); DB.Open(); ... ... DB.Close();
Eller er det bedre at oprette et helt nyt objekt hvergang og så kalde dem fx: DB1... DB2... o.s.v
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.