Avatar billede pfp Nybegynder
09. februar 2006 - 13:48 Der 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)

static ArrayList GetOrdersByDateSpan(DateTime start, DateTime end)
{
    ArrayList orders = new ArrayList();
    EstablishConnection();
    cmd.CommandText = "FindOrdersByDate";
        cmd.Parameters.AddWithValue("@Start", start);
        cmd.Parameters.AddWithValue("@End", end);
        reader = cmd.ExecuteReader();

    while (reader.Read())
        {
              int id = int.Parse(reader["OrderId"].ToString());
                Order o = GetOrder(id);
        orders.Add(o);
        }
   
    CleanUp();
    return orders;
}

static Order GetOrder(int orderId)
{
    EstablishConnection();
    cmd.CommandText = "GetOrder";
    cmd.Parameters.AddWithValue("@OrderId", orderId);
    reader = cmd.ExecuteReader();
   
    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? :)

/pfp
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 13:54 #1
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

eksempel:
conn=new Common.DBConn();
SQLDataSetCommand Comm=new SQLDataSetCommand("NET_PopularProduct_SelectMaster",Conn);
Comm.SelectCommand.CommandType=CommandType.StoredProcedure;
DataSet ds=new DataSet();
Comm.FillDataSet(ds,"PopItems");
Avatar billede pfp Nybegynder
09. februar 2006 - 14:06 #2
I hvilket namespace finder jeg SqlDataSetCommand? Syntes ikke den er i hvet System.Data.Sql eller System.Data.SqlClient?
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:10 #3
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);
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:12 #4
du kan evt lave det som en metode med

public DataSet GetADataset(string selectsaetning)
{
DataSet ds= new DataSet();
        SqlConnection conn = new SqlConnection("Dinconnectionstring");
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(selectsaetning, conn);
        adapter.Fill(ds);
return ds;
}
Avatar billede pfp Nybegynder
09. februar 2006 - 14:17 #5
Tak for det.

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)
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:20 #6
du kan gøre det ganske simpelt:

Dataset ds = nogetdata;

Foreach(DataRow dr in ds.Tables[0].Rows)
{
int id = int.Parse(dr["OrderId"].ToString());
                Order o = GetOrder(id);
        orders.Add(o);
}
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:27 #7
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.


Et link :
http://www.c-sharpcorner.com/Code/2004/Feb/DataSetsOverview.asp

DU finder mange gode links ved at søge på c# dataset tutorial på google.
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:28 #8
link til søgning:
http://www.google.dk/search?hl=da&q=c%23+dataset+tutorial&btnG=Google-s%C3%B8gning&meta=

smider det som et svar hvis det var hjælp nok.
Avatar billede pfp Nybegynder
09. februar 2006 - 14:34 #9
Tak for det - jeg kigger lidt nærmere på det.

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" :(
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:35 #10
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.
Avatar billede pfp Nybegynder
09. februar 2006 - 14:37 #11
Ja sådan er det da heldigvis, men ligenu er det meget at ændre :)

Jeg har da heldigvis en nogenlunde indkapsling, så jeg kan tage det i etaper :)
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:40 #12
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.
Avatar billede pfp Nybegynder
09. februar 2006 - 14:56 #13
Ja det er rigtigt med best practice, men en god practice er bl.a. at det virker efter hensigten :D

Så fik jeg implementeret dataset/dataadapter i GetOrdersByDateSpan, og det virker sørme perfekt.

Du skal have rigtig mange tak for hjælpen.
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 14:57 #14
np :)
takker for points :)
Avatar billede pfp Nybegynder
09. februar 2006 - 15:08 #15
Det er mig der takker.
Avatar billede dr_chaos Nybegynder
09. februar 2006 - 15:08 #16
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester