09. februar 2006 - 13:48Der er
15 kommentarer og 1 løsning
Cascade-kald til hentning af data fra database
Hej,
Jeg har muligvis roddet mig ud i et design, som jeg nu kan se ikke er alt for hensigtsmæssigt.
Jeg har en statisk funktionsklasse som bl.a. indeholder en IDataReader reader og en SqlCommand cmd, som er globale for hele funktionsklassen.
I samme klasser har jeg bl.a. disse fire metoder:
- static GetOrdersByDateSpan(DateTime start, DateTime end) - static GetOrder(int orderId) - static EstablishConnection() (i denne metode tjekker jeg om den globale cmd, har en åben forbindelse tilgængelig. Har den ikke det bliver den tildelt det) - static CleanUp() - (sørger for at dispose/close reader og cmd)
while(reader.Read()) { Order o = new Order(int orderId); // tildeler en masse værdier til ordre objektet }
CleanUp();
return o; }
Jeg har beskåret koden lidt, men selve ideen skulle være præsenteret.
Mit problem er at når jeg kalder GetOrdersByDateSpan, får jeg smidt en exception i dens videre kald til GetOrder, med beskeden: "There is already an open DataReader associated with this Command which must be closed first."
Det må jo være readeren fra GetOrdersByDateSpan, som først bliver lukket i slutningen af denne metode.
Hvordan bør min fremgangsmåde være med dette problem? Jeg vil selvfølgelig helst have så få åbn/luk af databasen som muligt, og helst ikke skulle skrotte det hele...
Nogle der har et par inputs til at redde min dag? :)
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
lav din reader i GetOrdersByDateSpan så du får et dataset ud i stedet for. på den måde kan du løbe datasettet igennem. I stedet for at forsøge at neste readers
hmm dårligt eksempel. her er et andet som bygger på System.Data.Sqlclient: DataSet ds= new DataSet(); SqlConnection conn = new SqlConnection("Dinconnectionstring"); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand("SELECT * FROM Tabel", conn); adapter.Fill(dataset);
Jeg har brug for at få mine data leveret som ArrayList..har du evt. link til artikler/tutorials omkring hvordan man arbejder med et DataSet (det er helt nyt for mig)
Datasets er meget kraftfulde at arbejde med. Jeg foretrækker personligt at arbejde med dem. Man kan hente mange tabeller ind i et dataset og lave relationer mellem tabellerne og skrive xml baseret på indholdet.
Nu irriterer det mig at jeg har skrevet små 4000 liniers data access kode, som bygger på mit førnævnte princip, uden først at have helt styr på "best practice" :(
tjaa. Meningen med programmering er jo at man hele tiden skal forsøge at udvikle sig. Man bliver jo klogere som tiden går. Man kan lave sindsygt mange dumme fejl.
ja ofte lærer man et nyt princip men det er for sent at ændre på tingene når man først er nået langt i sin programmering. Best practice er jo ofte en personlig opfattelse.
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.